我有一个巨大的数据框(大约100万个数据点),其中包含经度和纬度信息。我想获取国家和州/省的信息。然而,代码并没有我想象的那么高效
下面是我的代码:
示例数据框:
df = data.frame(
ID =c(A00001,A00002,A00003,A00004,A00005)
longitude = c(-98.84295,-91.11844,-75.91037,-71.00733,-92.29651)
latitude= c(43.98332,40.17851,39.26118,46.70087,45.49510)
)
第一:读取地理信息
library(sp)
library(rgdal)
library(dplyr)
countries_map<- readOGR(dsn="Country", layer="ne_10m_admin_0_countries")
states_map <- readOGR(dsn="States", layer="ne_10m_admin_1_states_provinces")
然后,构建一个函数并将结果导出到指定的数据框
geo_to_location <-function(lat,long){
#First the coordinates are transformed to spatialpoints
points<-SpatialPoints(data.frame(long,lat))
#Creating a projection of the coordinates on the map of countries
proj4string(points) <- proj4string(countries_map)
country<-as.character(over(points, countries_map)$NAME)
#The same for state/province
proj4string(points) <- proj4string(states_map)
state<-as.character(over(points, states_map)$name)
dplyr::bind_rows(setNames(c(country,state), c("Country", "State")))
}
df = df %>% dplyr::bind_cols(purrr::map2_dfr(.$latitude, .$longitude, geo_to_location ))
此方法有效,但 400,000 点已经需要大约 30 分钟才能完成。我有超过 400k 点需要处理。有没有更有效的方法来处理这个问题?
或者,没有更有效的方法来处理这项工作?
提前谢谢大家。
感谢@starja,他建议对函数进行向量化并使用 data.table 来替换 dplry。
我使用前 500 行进行测试,发现周转时间存在巨大差异。
以下是修改后的代码:
geo_to_location <-function(lat,long){
#First the coordinates are transformed to spatialpoints
points<-SpatialPoints(data.frame(long,lat))
#Creating a projection of the coordinates on the map of countries
proj4string(points) <- proj4string(countries_map)
country<-as.character(over(points, countries_map)$NAME)
#The same for state
proj4string(points) <- proj4string(states_map)
state<-as.character(over(points, states_map)$name)
return(list(country = country, state = state ))
}
df = as.data.table(df)
df[, c("Country","State_Province") := geo_to_location (latitude, longitude)]
df = as.data.frame(df)
原方法处理500个点大约需要3.194分钟。新方法大约花费了 0.651 秒。如果还有其他更有效的方法来处理这个问题,请告诉我,我可以学习更高级的技能。
再次感谢您的建议和帮助。
我也想弄清楚同样的事情。我有一个巨大的数据库,包含经纬度(和地理位置),但没有位置。我需要国家、州(美国)和县(美国)。解决方案非常简单。使用maps包中的map.where()函数。这对我有用。例如对于国家来说就是:
map.where(database = "world", df$lon, df$lat).
对于美国,只需为“世界”输入“州”或“县”即可。
HRK