簡體   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