Обратный поиск по геокоду (названия стран) для многих местоположений, вывод на проблемы с кадрами данных при отсутствии страны - PullRequest
0 голосов
/ 05 ноября 2018

Я использую пакет 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"

1 Ответ

0 голосов
/ 09 ноября 2018

установить параметр ошибки для возврата NA (и вы можете также извлечь только название страны из результатов работы) ...

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
...