许多位置的反向地理编码搜索(国家名称),当国家缺失时输出到数据框问题
Reverse geocode search (country names) for many locations, output to dataframe issues when country is missing
我正在使用 R 中的 geonames
包进行反向地理编码搜索 (GNcountryCode
) 以找到离我的输入最近的国家/地区。我的输入不是很精确,位于陆地附近的水中。 geonames
允许在输入位置的缓冲区 (km) 内进行搜索。
我试图使用 mapply
来加快从一长串输入位置中检索国家名称。但是,缓冲区大小的限制仍然使某些输入位置没有国家/地区。为了允许 mapply
继续 运行,我使用 tryCatch
来防止 mapply
停止。
但是,这会导致在整个列表列表(下面的输出)中出现非列表条目 ("Error")。因此,在尝试使用 data.table::rbindlist
时出现以下错误:"Item n of list input is not a data.frame, data.table or list"
我怎样才能循环或矢量化 GNcountryCode
以获得最接近输入位置的国家/地区名称,然后将此名称添加回 (cbind) 到原始数据框(理解某些位置不会匹配到一个国家)?
library(geonames)# requires a username for some functionality
Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
# df <- cbind.data.frame(Latitude, Longitude)
MyFun <- function(x,y) {
MyRes <- tryCatch(GNcountryCode(lat=x, lng=y, radius=250), error = function(e) paste("Error"))
#print(MyRes)
return(MyRes)
}
MyResult <- mapply(MyFun, Latitude, Longitude)
data.table::rbindlist(MyResult, fill = TRUE)
#cbind(df, data.table::rbindlist(MyResult, fill = TRUE))
#Ouput
$`32.75`
$`32.75`$`languages`
[1] "pt-PT,mwl"
$`32.75`$distance
[1] "1.96436"
$`32.75`$countryCode
[1] "PT"
$`32.75`$countryName
[1] "Portuguese Republic"
$`33.75`
[1] "Error"
$`33.75`
[1] "Error"
$`34.25`
[1] "Error"
$`34.25`
[1] "Error"
$`36.75`
$`36.75`$`languages`
[1] "pt-PT,mwl"
$`36.75`$distance
[1] "22.63538"
$`36.75`$countryCode
[1] "PT"
$`36.75`$countryName
[1] "Portuguese Republic"
将错误参数设置为 return NA(您可能还想从有效结果的 return 中提取国家/地区名称)...
library(geonames)# requires a username for some functionality
Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
df <- cbind.data.frame(Latitude, Longitude)
MyFun <- function(x,y) {
tryCatch(GNcountryCode(lat = x, lng = y, radius = 250)$countryName, error = function(e) NA_character_)
}
df$countryname <- mapply(MyFun, Latitude, Longitude)
df
# Latitude Longitude countryname
# 1 32.75 -17.25 Portuguese Republic
# 2 33.75 -52.25 <NA>
# 3 33.75 -51.75 <NA>
# 4 34.25 -52.25 <NA>
# 5 34.25 -51.75 <NA>
# 6 36.75 -25.25 Portuguese Republic
我正在使用 R 中的 geonames
包进行反向地理编码搜索 (GNcountryCode
) 以找到离我的输入最近的国家/地区。我的输入不是很精确,位于陆地附近的水中。 geonames
允许在输入位置的缓冲区 (km) 内进行搜索。
我试图使用 mapply
来加快从一长串输入位置中检索国家名称。但是,缓冲区大小的限制仍然使某些输入位置没有国家/地区。为了允许 mapply
继续 运行,我使用 tryCatch
来防止 mapply
停止。
但是,这会导致在整个列表列表(下面的输出)中出现非列表条目 ("Error")。因此,在尝试使用 data.table::rbindlist
时出现以下错误:"Item n of list input is not a data.frame, data.table or list"
我怎样才能循环或矢量化 GNcountryCode
以获得最接近输入位置的国家/地区名称,然后将此名称添加回 (cbind) 到原始数据框(理解某些位置不会匹配到一个国家)?
library(geonames)# requires a username for some functionality
Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
# df <- cbind.data.frame(Latitude, Longitude)
MyFun <- function(x,y) {
MyRes <- tryCatch(GNcountryCode(lat=x, lng=y, radius=250), error = function(e) paste("Error"))
#print(MyRes)
return(MyRes)
}
MyResult <- mapply(MyFun, Latitude, Longitude)
data.table::rbindlist(MyResult, fill = TRUE)
#cbind(df, data.table::rbindlist(MyResult, fill = TRUE))
#Ouput
$`32.75`
$`32.75`$`languages`
[1] "pt-PT,mwl"
$`32.75`$distance
[1] "1.96436"
$`32.75`$countryCode
[1] "PT"
$`32.75`$countryName
[1] "Portuguese Republic"
$`33.75`
[1] "Error"
$`33.75`
[1] "Error"
$`34.25`
[1] "Error"
$`34.25`
[1] "Error"
$`36.75`
$`36.75`$`languages`
[1] "pt-PT,mwl"
$`36.75`$distance
[1] "22.63538"
$`36.75`$countryCode
[1] "PT"
$`36.75`$countryName
[1] "Portuguese Republic"
将错误参数设置为 return NA(您可能还想从有效结果的 return 中提取国家/地区名称)...
library(geonames)# requires a username for some functionality
Latitude <- c("32.75", "33.75", "33.75", "34.25", "34.25", "36.75")
Longitude <- c("-17.25", "-52.25", "-51.75", "-52.25", "-51.75", "-25.25")
df <- cbind.data.frame(Latitude, Longitude)
MyFun <- function(x,y) {
tryCatch(GNcountryCode(lat = x, lng = y, radius = 250)$countryName, error = function(e) NA_character_)
}
df$countryname <- mapply(MyFun, Latitude, Longitude)
df
# Latitude Longitude countryname
# 1 32.75 -17.25 Portuguese Republic
# 2 33.75 -52.25 <NA>
# 3 33.75 -51.75 <NA>
# 4 34.25 -52.25 <NA>
# 5 34.25 -51.75 <NA>
# 6 36.75 -25.25 Portuguese Republic