r- 绑定数据帧列表的行,同时将空数据帧保留为 NA 行

pgo*_*don 5 r list dataframe rbind dplyr

我正在寻找一种方法将数据帧列表(一行或空的大约 7000 个数据帧)重新绑定到单个数据帧中,但不删除列表中的空数据帧。

\n\n
## Example of data\nl <- list(Name1 = data.frame(), \n                 Name2 = data.frame(V1 = "A", V2 = "B", stringsAsFactors = F), \n                 Name3 = data.frame(V1="B", V2= NA, V3 ="C", stringsAsFactors = F))\n\n> l\n$Name1\ndata frame with 0 columns and 0 rows\n\n$Name2\n  V1 V2\n1  A  B\n\n$Name3\n  V1 V2 V3\n1  B NA  C\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我尝试了一些 dplyr 解决方案,但它没有保留空数据框(并不奇怪,因为它没有行)

\n\n
## rbind\nlibrary(dplyr)\n\ndf <- bind_rows(l,.id = "NAME")\n\n> df\n   NAME V1   V2   V3\n1 Name2  A    B <NA>\n2 Name3  B <NA>    C\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有一种简单的方法可以得到这样的东西?

\n\n
> df\n   NAME V1   V2   V3\n1 Name1 <NA> <NA> <NA>\n2 Name2  A    B <NA>\n3 Name3  B <NA>    C\n
Run Code Online (Sandbox Code Playgroud)\n\n

看来使用 tidyr::complete 适用于我的示例,

\n\n
df <- bind_rows(l,.id = "NAME") %>% complete(NAME = names(l))\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

但不适用于我的整个数据集。\n这里是我的实际数据集的头部

\n\n
dput(head(GNPlaceName))\nlist(Seydikemer = structure(list(), class = "data.frame", row.names = integer(0)), \n    Fanna = structure(list(timezone.gmtOffset = "1", timezone.timeZoneId = "Europe/Rome", \n        timezone.dstOffset = "2", bbox.east = "12.7623022680034", \n        bbox.south = "46.1770686700141", bbox.north = "46.1904973822354", \n        bbox.west = "12.7415900814293", bbox.accuracyLevel = "10", \n        asciiName = "Fanna", astergdem = "258", countryId = "3175395", \n        fcl = "P", srtm3 = "263", score = "62.2252464294434", \n        adminId2 = "3170146", adminId3 = "6537931", countryCode = "IT", \n        adminCodes2.ISO3166_2 = "PN", adminCodes1.ISO3166_2 = "36", \n        adminId1 = "3176525", lat = "46.18455", fcode = "PPLA3", \n        continentCode = "EU", elevation = "274", adminCode2 = "PN", \n        adminCode3 = "093020", adminCode1 = "06", lng = "12.75161", \n        geonameId = "3177221", toponymName = "Fanna", population = "1500", \n        adminName5 = "", adminName4 = "", adminName3 = "Fanna", \n        alternateNames.name = "Fane", alternateNames.lang = "fur", \n        adminName2 = "Province of Pordenone", name = "Fanna", \n        fclName = "city, village,...", countryName = "Italy", \n        fcodeName = "seat of a third-order administrative division", \n        adminName1 = "Friuli Venezia Giulia"), row.names = c(NA, \n    -1L), class = "data.frame"), Warsaw = structure(list(timezone.gmtOffset = "1", \n        timezone.timeZoneId = "Europe/Warsaw", timezone.dstOffset = "2", \n        bbox.east = "21.2711512942955", bbox.south = "52.0978496125492", \n        bbox.north = "52.368153944595", bbox.west = "20.8516883368428", \n        bbox.accuracyLevel = "10", asciiName = "Warsaw", astergdem = "121", \n        countryId = "798544", fcl = "P", srtm3 = "113", score = "145.618896484375", \n        adminId2 = "6695624", adminId3 = "7531926", countryCode = "PL", \n        adminCodes1.ISO3166_2 = "14", adminId1 = "858787", lat = "52.22977", \n        fcode = "PPLC", continentCode = "EU", adminCode2 = "1465", \n        adminCode3 = "146501", adminCode1 = "78", lng = "21.01178", \n        geonameId = "756135", toponymName = "Warsaw", population = "1702139", \n        adminName5 = "", adminName4 = "", adminName3 = "Warsaw", \n        alternateNames.name = "Warskou", alternateNames.lang = "af", \n        alternateNames.isShortName = "TRUE", alternateNames.isPreferredName = "TRUE", \n        adminName2 = "Warszawa", name = "Warsaw", fclName = "city, village,...", \n        countryName = "Poland", fcodeName = "capital of a political entity", \n        adminName1 = "Mazovia"), row.names = c(NA, -1L), class = "data.frame"), \n    `Gaverina Terme` = structure(list(timezone.gmtOffset = "1", \n        timezone.timeZoneId = "Europe/Rome", timezone.dstOffset = "2", \n        bbox.east = "9.89570095710424", bbox.south = "45.7540309868418", \n        bbox.north = "45.7576290305937", bbox.west = "9.8836191498607", \n        bbox.accuracyLevel = "10", asciiName = "Gaverina Terme", \n        astergdem = "502", countryId = "3175395", fcl = "P", \n        srtm3 = "494", score = "22.0922546386719", adminId2 = "3182163", \n        adminId3 = "6542955", countryCode = "IT", adminCodes2.ISO3166_2 = "BG", \n        adminCodes1.ISO3166_2 = "25", adminId1 = "3174618", lat = "45.75578", \n        fcode = "PPLA3", continentCode = "EU", elevation = "509", \n        adminCode2 = "BG", adminCode3 = "016110", adminCode1 = "09", \n        lng = "9.88666", geonameId = "6534969", toponymName = "Gaverina Terme", \n        population = "358", adminName5 = "", adminName4 = "", \n        adminName3 = "Gaverina Terme", alternateNames.name = "ITGVR", \n        alternateNames.lang = "unlc", adminName2 = "Provincia di Bergamo", \n        name = "Gaverina Terme", fclName = "city, village,...", \n        countryName = "Italy", fcodeName = "seat of a third-order administrative division", \n        adminName1 = "Lombardy"), row.names = c(NA, -1L), class = "data.frame"), \n    `Ca\xc3\xb1averal de Le\xc3\xb3n` = structure(list(timezone.gmtOffset = "1", \n        timezone.timeZoneId = "Europe/Madrid", timezone.dstOffset = "2", \n        bbox.east = "-6.49382969510649", bbox.south = "37.9986794024971", \n        bbox.north = "38.0346539975029", bbox.west = "-6.53950370489351", \n        bbox.accuracyLevel = "1", asciiName = "Canaveral de Leon", \n        astergdem = "524", countryId = "2510769", fcl = "P", \n        srtm3 = "528", score = "45.6841278076172", adminId2 = "2516547", \n        adminId3 = "6358196", countryCode = "ES", adminCodes2.ISO3166_2 = "H", \n        adminCodes1.ISO3166_2 = "AN", adminId1 = "2593109", lat = "38.01667", \n        fcode = "PPLA3", continentCode = "EU", adminCode2 = "H", \n        adminCode3 = "21020", adminCode1 = "51", lng = "-6.51667", \n        geonameId = "2520292", toponymName = "Ca\xc3\xb1averal de Le\xc3\xb3n", \n        population = "0", adminName5 = "", adminName4 = "", adminName3 = "Ca\xc3\xb1averal de Le\xc3\xb3n", \n        alternateNames.name = "https://en.wikipedia.org/wiki/Ca%C3%B1averal_de_Le%C3%B3n", \n        alternateNames.lang = "link", adminName2 = "Huelva", \n        name = "Ca\xc3\xb1averal de Le\xc3\xb3n", fclName = "city, village,...", \n        countryName = "Spain", fcodeName = "seat of a third-order administrative division", \n        adminName1 = "Andalusia"), row.names = c(NA, -1L), class = "data.frame"), \n    Voranava = structure(list(timezone.gmtOffset = "3", timezone.timeZoneId = "Europe/Minsk", \n        timezone.dstOffset = "3", bbox.east = "25.3283727016391", \n        bbox.south = "54.139144795013", bbox.north = "54.159255204987", \n        bbox.west = "25.2940272983609", bbox.accuracyLevel = "2", \n        asciiName = "Voranava", astergdem = "170", countryId = "630336", \n        fcl = "P", srtm3 = "172", score = "62.4154739379883", \n        countryCode = "BY", adminCodes1.ISO3166_2 = "HR", adminId1 = "628035", \n        lat = "54.1492", fcode = "PPLA2", continentCode = "EU", \n        adminCode1 = "03", lng = "25.3112", geonameId = "619979", \n        toponymName = "Voranava", population = "6500", adminName5 = "", \n        adminName4 = "", adminName3 = "", alternateNames.name = "\xd0\x92\xd0\xbe\xd1\x80\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xb2\xd0\xb0", \n        alternateNames.lang = "be", adminName2 = "", name = "Voranava", \n        fclName = "city, village,...", countryName = "Belarus", \n        fcodeName = "seat of a second-order administrative division", \n        adminName1 = "Grodnenskaya"), row.names = c(NA, -1L), class = "data.frame"))\n
Run Code Online (Sandbox Code Playgroud)\n\n

太感谢了

\n

tmf*_*mnk 4

一种dplyr选择tidyr可能是:

bind_rows(l, .id = "Names") %>%
 complete(Names = names(l))

  Names V1    V2    V3   
  <chr> <chr> <chr> <chr>
1 Name1 <NA>  <NA>  <NA> 
2 Name2 A     B     <NA> 
3 Name3 B     <NA>  C  
Run Code Online (Sandbox Code Playgroud)