Соответствие "между" значениями данных в R - PullRequest
0 голосов
/ 06 апреля 2020

Я просто новичок в R (я использую Python для очистки данных), поэтому давайте go прямо к точке.

Проблема: я работаю со значениями широты и долготы и я хочу показать, где каждый из них l ie в данном диапазоне (в другом кадре данных).

Пример Кадр данных 1: df_longlat

LAT_ LONG_

14,57244 120,9822

Кадр данных 2: df_grid

Grid_ID lat1 lat2 long1 long1

1000 14.57546 14.57097 120.9778 120.9827

Ожидаемый результат: (Поскольку широта и долгота первого кадра данных находятся в диапазоне, заданном во втором кадре данных, Grid_ID = 1000 отражается в первом кадре данных.)

Grid_ID LAT_ LONG_

1000 14.57244 120.9822

Решение Попытка: Я попытался выполнить ifelse для этого кадра данных, но он не будет сканировать каждую отдельную запись. Мне нужно что-то, что будет сканировать все записи в dataframe1, чтобы они получили идентификатор сетки в dataframe2.

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))

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Спасибо тем, кто помог. Я попробовал другой подход, используя «SQLDF», и он работал отлично. Обратите внимание, что я сравниваю 2,4 миллиона строк данных с 43 000 строк поиска строк, поэтому мне потребовалось 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)
0 голосов
/ 07 апреля 2020

Вы можете попробовать использовать пакет 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
...