R并行循环返回不完整结果

3lxsmp7m  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个 Dataframe 类似于这个:

Df = data.frame(Address = c("ANDRES DUARTE 37, ALAGÓN (ZARAGOZA)", "CASTILLO 5, ALAGÓN (ZARAGOZA)", "PORTILLO 4, ALAGÓN (ZARAGOZA)"),
                Latitude = rep(NA, 3),
                Longitude = rep(NA, 3))

我试图通过使用caRtociudad包对Address列中的地址进行地理编码来填充LatitudeLongitude列中的值,我能想到的最简单的解决方案是执行for()循环:

for (i in 1:nrow(Df)) {
  
  Loc <- caRtociudad::cartociudad_geocode(Df$Address[i])
  
  Df$Latitude[i] = Loc$lat
  Df$Longitude[i] = Loc$lng

}

问题是,真实的的Df对象有超过250000行,我想通过使用foreach包的并行编程来加速这个过程,但由于各种原因,我目前所尝试的并没有达到预期的效果。
我的第一个尝试是这样的:

Df$Latitude <- foreach(i = 1:nrow(Df), .combine = c, .packages = "caRtociudad") %dopar% {
  
  Lat = try(cartociudad_geocode(Df$Address[i]))
  
  if(class(Lat)[1] == "try-error"){
    Lat = NA
  } else {
    Lat = Loc$lat
  }
  
  return(Lat)
}

Df$Longitude <- foreach(i = 1:nrow(Df), .combine = c, .packages = "caRtociudad") %dopar% {
  
  Lon = try(cartociudad_geocode(Df$Address[i]))
  
  if(class(Lon)[1] == "try-error"){
    Lon = NA
  } else {
    Lon = Loc$lng
  }
  
  return(Lon)
}

这会失败,因为即使地址不同,它也会为所有值返回相同的坐标。
然后我试着:

foreach(i = 1:nrow(Df), .combine = "rbind", .packages = "caRtociudad", .export = "Df") %dopar% {
  Loc = cartociudad_geocode(Df$Address[i])
  Df$Latitude[i] <<- Loc$lat
  Df$Longitude[i] <<- Loc$lng
}

但这会返回:我尝试了其他几次迭代,但都返回了类似的错误,我真的不知道该再尝试什么。
任何帮助都将不胜感激。

fcipmucu

fcipmucu1#

正如@罗兰在评论中指出的,问题出在我自己的代码中,因为我拼错了两个变量。

Df$Latitude <- foreach(i = 1:nrow(Df), .combine = c, .packages = "caRtociudad") %dopar% {
  
  Lat = try(cartociudad_geocode(Df$Address[i]))
  
  if(class(Lat)[1] == "try-error"){
    Lat = NA
  } else {
    Lat = Lat$lat
  }
  
  return(Lat)
}

Df$Longitude <- foreach(i = 1:nrow(Df), .combine = c, .packages = "caRtociudad") %dopar% {
  
  Lon = try(cartociudad_geocode(Df$Address[i]))
  
  if(class(Lon)[1] == "try-error"){
    Lon = NA
  } else {
    Lon = Lon$lng
  }
  
  return(Lon)
}

相关问题