Lapply 函数对列表在第一项之后停止



我正在使用以下函数将地址列表转换为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)
}

正如评论中已经提到的: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

其次,我认为你在这里根本不需要字符串拆分。函数geocodeAdddress不返回单个字符串,而是返回两个字符串的向量。然后,您可以在循环中分配结果:

for (i in 1:nrow(mylist)) {
df[i, ] <- geocodeAdddress(mylist[i, ])
}

最新更新