[英]Matching “in between” dataframe values in R
我只是 R 的初学者(我之前使用 Python 来清理数据),所以让我们直接使用 go。
问题:我正在处理纬度和经度值,我想显示它们中的每一个在给定范围内的位置(在另一个数据框中)。
示例Dataframe 1:df_longlat
LAT_ LONG_
14.57244 120.9822
Dataframe 2:df_grid
Grid_ID lat1 lat2 long1 long2
1000 14.57546 14.57097 120.9778 120.9827
预期结果:(由于第一个 dataframe 的纬度和经度都在第二个 dataframe 给出的范围内,因此 Grid_ID = 1000 反映在第一个 Z6A8064B5DF479455057070 中)
Grid_ID LAT_ LONG_
1000 14.57244 120.9822
解决方案尝试:我尝试为这个 dataframe 做一个 ifelse,但它不会扫描每个单独的条目。 我需要一些可以扫描 dataframe1 中所有条目的东西,以便他们在 dataframe2 中获取网格 ID。
Lat_Test <- ifelse(((df_longlat$LAT_ >= df_grid$lat2) & (df_longlat$LAT_ <= df_grid$lat1)),df_grid$grid_id, NA)
Lat_Test <- as.data.frame(Lat_Test)
Long_Test <- ifelse(((df_longlat$LONG_ >= df_grid$long1) & (df_longlat$LONG_ <= df_grid$long2)),df_grid$grid_id, NA)
Long_Test <- as.data.frame((Long_Test))
先感谢您。
您可以尝试使用模糊连接fuzzyjoin
。
fuzzyjoin::fuzzy_inner_join(df1, df2,
by = c('Latitude' = 'Latitude1', 'Latitude' = 'Latitude2',
'Longitude' = 'Longitude1', 'Longitude' = 'Longitude2'),
match_fun = list(`>=`, `<=`, `>=`, `<=`))
# Latitude Longitude ID Latitude1 Latitude2 Longitude1 Longitude2
#1 12.1 4.1 ABC 11.50 12.15 3.90 4.15
#2 12.2 4.2 DEF 12.17 12.25 4.17 4.25
感谢那些帮助过的人。 我尝试了一种使用“SQLDF”的不同方法,并且效果很好。 请注意,我将 240 万行 dataframe 与 43,000 行查找 dataframe 进行比较,所以我花了 3 个小时来运行。
sql_way_test <- function(data,lookup){
data<-sqldf("select A.*,B.ID from
data A left join lookup B
ON ((A.Latitude >= B.Latitude1 and A.Latitude < B.Latitude2) and
(A.Longitude >= B.Longitude1 and A.Longitude < B.Longitude2))")
data
}
df_SQLway <- sql_way_test(data = df1, df2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.