我希望使用〜17,000 lat
/ lon
值的数据框,以获取并填充具有等效状态的新列。
到目前为止,我已经尝试了其他Stack Overflow答案中建议的几种解决方案(在此无法列出太多,但超过十种),但没有一个对我有用。
我找到解决方案的最接近方法是使用ggmap
软件包,但是问题是,尽管只发送了一个lat
/ { {1}}有价值。
我有单独的lon
和lat
值,甚至也将它们组合成lon
格式,尽管如此,上述解决方案都不适合我。
我要做的是根据给定的lat,lon
/ lat/lon
值确定状态,并将状态保存在新列(coord
)中。
我最初匹配所有城市值以获得匹配状态,但是问题在于,由于多个州包含同名城市,因此匹配过程在第一次成功匹配后就停止了;结果,我发现自己有2800多个属于AK的城市,尽管它们实际上相距几千英里。
任何建议都会很棒。
以下是我的数据的df$state
,coords
和lat
列的前100行:
lon
答案 0 :(得分:6)
使用over
包中的函数sp
:
library(geojsonio)
library(sp)
# get usa polygon data
# http://eric.clst.org/tech/usgeojson/
usa <- geojson_read(
"http://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_040_00_500k.json",
what = "sp"
)
df$state <- NA
# compare points
for (i in 1:nrow(df)) {
coords <- c(df$origin_lon[i], df$origin_lat[i])
if(any(is.na(coords))) next
point <- sp::SpatialPoints(
matrix(
coords,
nrow = 1
)
)
sp::proj4string(point) <- sp::proj4string(usa)
polygon_check <- sp::over(point, usa)
df$state[i] <- as.character(polygon_check$NAME)
}
> head(df)
origin_coords origin_lat origin_lon state
1 31.9618,-83.0588 31.9618 -83.0588 Georgia
2 44.8782,-69.4718 44.8782 -69.4718 Maine
3 37.3894,-121.8868 37.3894 -121.8868 California
4 36.0485,-93.5044 36.0485 -93.5044 Arkansas
5 37.652,-120.7292 37.6520 -120.7292 California
6 33.7942,-84.2018 33.7942 -84.2018 Georgia
答案 1 :(得分:3)
这是一个SF解决方案,其中使用具有美国状态st_join
(从USAboundaties包创建)的空间对象的空间连接states_sf
,以及包含数据点{{1}的空间对象}}。
请验证结果,因为我对R中的空间工作还很陌生。
只需为您需要的列过滤结果data.frame。
points_sf