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