【发布时间】:2017-06-09 17:49:19
【问题描述】:
我有一个来自 googleway 包的地理编码输出列表(ggmap 地理编码不适用于 API 密钥)存储在一个列表中,其中每个元素都包含两个列表。但是,对于没有找到结果的地址,列表的结构是不同的,这让我将列表转换为数据框的尝试感到沮丧。
“非缺失”结果(使用 dput() 创建)的结构如下(忽略乱码,RStudio 无法在控制台中正确显示 Cyrillic):
structure(list(results = structure(list(address_components = list(
structure(list(long_name = c("11À", "óëèöà Ãîãîëÿ", "Çåëåíîãðàäñêèé àäìèíèñòðàòèâíûé îêðóã",
"Çåëåíîãðàä", "Ìîñêâà", "Ìîñêâà", "Ðîññèÿ", "124575"), short_name = c("11À",
"óë. Ãîãîëÿ", "Çåëåíîãðàäñêèé àäìèíèñòðàòèâíûé îêðóã", "Çåëåíîãðàä",
"Ìîñêâà", "Ìîñêâà", "RU", "124575"), types = list("street_number",
"route", c("political", "sublocality", "sublocality_level_1"
), c("locality", "political"), c("administrative_area_level_2",
"political"), c("administrative_area_level_1", "political"
), c("country", "political"), "postal_code")), .Names = c("long_name",
"short_name", "types"), class = "data.frame", row.names = c(NA,
8L))), formatted_address = "óë. Ãîãîëÿ, 11À, Çåëåíîãðàä, Ìîñêâà, Ðîññèÿ, 124575",
geometry = structure(list(location = structure(list(lat = 55.987567,
lng = 37.17152), .Names = c("lat", "lng"), class = "data.frame", row.names = 1L),
location_type = "ROOFTOP", viewport = structure(list(
northeast = structure(list(lat = 55.9889159802915,
lng = 37.1728689802915), .Names = c("lat", "lng"
), class = "data.frame", row.names = 1L), southwest = structure(list(
lat = 55.9862180197085, lng = 37.1701710197085), .Names = c("lat",
"lng"), class = "data.frame", row.names = 1L)), .Names = c("northeast",
"southwest"), class = "data.frame", row.names = 1L)), .Names = c("location",
"location_type", "viewport"), class = "data.frame", row.names = 1L),
place_id = "ChIJzXSgUeQUtUYREIohzQOG--A", types = list("street_address")), .Names = c("address_components",
"formatted_address", "geometry", "place_id", "types"), class = "data.frame", row.names = 1L),
status = "OK"), .Names = c("results", "status"))
“缺失”结果的结构如下:
structure(list(results = list(), status = "ZERO_RESULTS"), .Names = c("results",
"status"))
基本上,问题似乎是,当函数没有从 Google API 获得结果时,它会创建一个空列表,而不是一个与“非缺失”列表具有相同元素的列表,其中 NA 为价值观。当您将这些列表传递给data.frame() 时,这会产生错误,因为它无法从无到有创建数据框。
在将结果子列表提取到自己的列表中后,我在这里尝试了解决方案:Converting nested list (unequal length) to data frame。它应该填写 NA 并创建等长列表,从而可以转换为数据框:
first100geocode.results.l <- vector("list", 100)
for(i in 1:length(first100geocode.results.l)){
first100geocode.results.l[[i]] <- first100geocode[[i]]$results
}
indx <- sapply(first100geocode.results.l, length)
res <- as.data.frame(do.call(rbind,lapply(first100geocode.results.l,
`length<-`, max(indx))))
colnames(res) <- names(first100geocode.results.l[[which.max(indx)]])
但是,创建“res”对象的行会抛出错误:Error in rbind(deparse.level, ...) : invalid list argument: all variables should have the same length'.
是否有其他方法可以为缺失的结果填充 NA,以便我可以将其转换为数据框?
(注意:我不能简单地删除丢失的结果,我需要将其绑定回原始地址列表)。
【问题讨论】:
-
你能用
dput()来补充str()吗? -
@Aurèle 是的,感谢您指出这一点 - 抱歉,我最初忘记了。
-
所以,我无法阅读足够多的废话来判断哪一行需要 NA 而哪一行不需要,但是您始终可以将 NA 与 c(NA, x) 或 c(x, NA) 还是 c(x[1:4], NA, x[5:6])?
-
@EvanFriedland 胡言乱语实际上应该是无关紧要的 - 代码表示一个列表,它将形成数据集的一行,诸如“formatted_address”之类的元素成为列。问题是,如果您查看“NA”的第二个代码块,则会创建一个空列表
(results = list()。为了使其成为数据框,该空列表需要填充原始列表的元素(即名称),并将值设置为“NA”或更改为在转换时将为所有列返回 NA 的内容到数据框。 -
该包返回
address_components,因为这是 Google 返回的,我不想尝试去猜测用户会发现什么有用,什么不会有用。
标签: r list dataframe missing-data googleway