繁体   English   中英

在 R 中匹配“介于两者之间”的 dataframe 值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM