我正在尝试使用 googleway 对一些地址进行地理编码。我想要返回地理编码、地址和县。
使用上面链接的答案,我创建了以下函数。
geocodes<-lapply(seq_along(res),function(x) {
coordinates<-res[[x]]$results$geometry$location
df<-as.data.frame(unlist(res[[x]]$results$address_components))
address<-paste(df[1,],df[2,],sep = " ")
city<-paste0(df[3,])
county<-paste0(df[4,])
state<-paste0(df[5,])
zip<-paste0(df[7,])
coordinates<-cbind(coordinates,address,city,county,state,zip)
coordinates<-as.data.frame(coordinates)
})
然后像这样重新组合起来......
library(data.table)
done<-rbindlist(geocodes))
问题是将地址和县从“res”列表中删除。上面链接的答案从发送给谷歌的数据框中提取地址,并假设列表的顺序正确,并且谷歌没有返回多个匹配结果(在我的列表中似乎有几个)。关键是,从一个文件中获取地址并从另一个文件中获取坐标似乎相当鲁莽,因为无论如何我都需要县,我需要一种方法将其从谷歌保存在“res”中的结果列表中拉出来。
问题是某些地址比其他地址具有更多的“类型”,这意味着像我上面所做的那样按行引用是行不通的。
我还尝试在函数中包含 rbindlist 以将子列表转换为数据表,然后提取字段,但不能完全使其工作。这种方法的问题是实际地址在向量中,但我用来过滤或选择的“类型”字段在子列表中。
我可以描述它的最佳方式是这样的 - list <- c(long address),c(short address), types(LIST(street number, route, County, etc.))
显然,我是这方面的初学者。我知道有一种更简单的方法,但我真的很挣扎于列表,而 R 似乎广泛使用了它们。
编辑:我绝对承认我无法 rbind 整个列表。我需要拉出特定元素并仅绑定这些元素。在我看来,问题的很大一部分是我没有很好地处理索引和操作列表。
以下是一些可以尝试的地址 - “301 Adams St, Friendship, WI 53934, USA”具有 7X3 “地址组件”和对应的 7 个“类型”列表。与“222 S Walnut St, Appleton, WI 45911, USA”进行比较",其地址组件为 9X3,“类型”列表为 9。类型列表需要连接回地址组件矩阵,因为类型列表标识地址组件矩阵的每一行包含的内容。
然后,不完全匹配会带来更多的复杂性。试试“211 Grand Avenue, Rothschild, WI, 54474”,你会得到 2 个列表,一个是东大街,一个是西大街。谷歌似乎更喜欢东方,因为这是“格式化地址”中的内容。我真的不在乎使用哪个,因为县将是相同的。有趣的是,“位置”包含 2 组地理编码,大概是指这两个匹配项。我认为这种复杂性可以忽略不计,因为由两个坐标组成的位置仍存储为“双精度”(不是列表!),因此它应该与其他地址的坐标堆叠。
编辑:这应该真的有效,但我在函数的 do.call(rbind,types) 行中遇到错误。
geocodes<-lapply(seq_along(res),function(x) {
coordinates<-res[[x]]$results$geometry$location
types<-res[[x]]$results$address_components[[1]]$types
types<-do.call(rbind,types)
types<-types[,1]
address<-as.data.frame(res[[x]]$results$address_components[[1]]$long_name,strings.As.Factors=FALSE)
names(address)[1]<-"V2"
address<-cbind(address,types)
address<-tidyr::spread(address,types,V2)
address<-cbind(address,coordinates)
})
R 说“类型”对象不是一个列表,所以它不能 rbind 它。我尝试将其强制到列表中,但仍然出现错误。我使用以下配对向下函数进行了检查,发现 #294 为空。这会停止该功能。我收到“超过查询限制”作为错误,但我没有超过查询限制。
geocodes<-lapply(seq_along(res),function(x) {
types<-res[[x]]$results$address_components[[1]]$types
print(typeof(types))
})