Как обрабатывать пропущенные значения при использовании обратной геокодирующей функции?
В настоящее время я работаю с данными (N из 271 848) в R, которые выглядят следующим образом:
Observation Longitude Latitude
--------------------------------------
1 116.38800 39.928902
2 53.000000 32.000000
3 NA NA
4 NA NA
И я использую функцию обратного геокодирования из следующего поста: Преобразование координат широты и долготы в название страны в R
Когда я бегу coords2country(points)
линия, я получаю следующую ошибку:
"Ошибка в.checkNumericCoerce2double(obj): неконечные координаты"
Я думаю, что функция не знает, как обрабатывать пропущенные значения. Когда я запускаю код на подмножестве наблюдений (исключая NA / отсутствующие значения), это работает.
Я попытался слегка изменить функцию (см. Последнюю строку ниже), чтобы исправить эту проблему, но это все равно привело к ошибке, о которой я говорил выше.
Воспроизводимый пример:
Data <- data.frame(
Observation = 1:5,
Longitude = c(116.3880005, 53, -97, NA, NA),
Latitude = c(39.92890167, 32, 32, NA, NA))
library(sp)
library(rworldmap)
coords2country = function(points)
{
countriesSP <- getMap(resolution='low')
#countriesSP <- getMap(resolution='high') #you could use high res map from rworldxtra if you were concerned about detail
# convert our list of points to a SpatialPoints object
#pointsSP = SpatialPoints(points, proj4string=CRS("+proj=longlat +datum=wgs84"))
#! andy modified to make the CRS the same as rworldmap
#pointsSP = SpatialPoints(points, proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
# new changes in worldmap means you have to use this new CRS (bogdan):
pointsSP = SpatialPoints(points, proj4string=CRS(" +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"))
# use 'over' to get indices of the Polygons object containing each point
indices = over(pointsSP, countriesSP)
# return the ADMIN names of each country
indices$ADMIN
#indices$ISO3 # returns the ISO3 code
#The line below is what I thought could resolve the problem.
na.action = na.omit
}
1 ответ
Решение
Лучше использовать это вместо:
coords2country_NAsafe <- function(points)
{
bad <- with(points, is.na(lon) | is.na(lat))
result <- character(length(bad))
result[!bad] <- coords2country(points[!bad,])
result
}