Я использую пакет geonames
в R для поиска в обратном геокоде (GNcountryCode
), чтобы найти ближайшую страну к моим данным. Мои входные данные не очень точны и находятся в воде возле земли. geonames
позволяет выполнять поиск в буфере (км) от местоположения ввода.
Я пытался использовать mapply
для ускорения поиска названий стран из длинного списка вводимых местоположений. Однако ограничения на размер буфера по-прежнему оставляют некоторые входные местоположения без страны. Чтобы разрешить mapply
продолжить работу, я использовал tryCatch
для предотвращения остановки mapply
.
Однако это приводит к отсутствию списка («Ошибка») в общем списке списков (вывод ниже). Таким образом, при попытке использовать data.table::rbindlist
я получаю следующую ошибку: «Элемент n ввода списка не является data.frame, data.table или 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"