我使用以下函数将地址列表转换为gps坐标:
geocodeAdddress <- function(address) {
url <- "http://maps.google.com/maps/api/geocode/json?address="
url <- URLencode(paste(url, address, "&sensor=false", sep = ""))
x <- fromJSON(url, simplify = FALSE)
if (x$status == "OK") {
out <- c(x$results[[1]]$geometry$location$lng,
x$results[[1]]$geometry$location$lat)
} else {
out <- NA
}
Sys.sleep(0.2) # API only allows 5 requests per second
out
}
一旦我使用以下lapply列表,我只得到一个结果而不是完整列表:
mylist <-read.table('my.csv',sep=",",allowEscapes=TRUE)
latlonglist <- lapply(mylist,geocodeAdddress)
我尝试了for循环,但也没有用。任何想法都会很棒。感谢
以伪代码更新她,或者据我所知,到目前为止,我将要实现的目标是什么:
创建空数据框:
df <- data.frame(matrix(ncol = 2, nrow = 0))
x <- c("longitude", "latitude")
colnames(df) <- x
循环浏览您的列表:
for (i in 1:nrow(mylist)) {
all = geocodeAdddress(mylist[i, ])
Pseudo code:
everything before space long = strsplit(all, " ")
everything after space lat = strsplit(all, " ")
long append data.frame(longitude)
lat append data.frame(longitude)
}
答案 0 :(得分:1)
正如评论中已经提到的那样:lapply
遍历列,而不是遍历行。您可以使用for
循环来为每行调用函数:
for (i in 1:nrow(mylist)) {
geocodeAdddress(mylist[i, ])
}
请注意,mylist[i, ]
会选择整个i-th
行。如果您想在第一列中使用值,则可以使用mylist[i, 1]
更新如何在数据框中存储数据:
首先,我会立即预先分配整个data.frame,而不是每次都添加一行。你可以这样做:
df <- data.frame(matrix(ncol = 2, nrow = nrow(mylist)))
x <- c("longitude", "latitude")
colnames(df) <- x
其次,我认为你根本不需要stringsplit。函数geocodeAdddress
不返回单个字符串,而是返回两个字符串的向量。然后,您可以在循环中分配结果:
for (i in 1:nrow(mylist)) {
df[i, ] <- geocodeAdddress(mylist[i, ])
}