在第一个项目之后停止向列表提供功能

时间:2017-08-02 12:51:28

标签: r

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

1 个答案:

答案 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, ])
}