В R фильтруйте строки одной таблицы на основе совпадений с другой таблицей И даты меньше, чем в другой таблице - PullRequest
0 голосов
/ 16 июня 2020

У меня есть две таблицы в R, похожие на следующие:

df1
lat long  date
1.1  2.3  12-4-70
3.3  7.3  5-5-80
1.1  2.3  7-2-90

df2
lat  long date
1.1  2.3  6-12-82
3.3  2.4  6-10-83
8.4  7.3  8-19-88

Я хочу выбрать все строки из df1, которые имеют строку в df2, где lat и long совпадают, а дата в df1 меньше чем дата в df2. Учитывая приведенные выше таблицы, желаемый результат будет:

filtered_df1
lat  long  date
1.1  2.3   12-4-70

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Другой вариант - неэквивалентное соединение с data.table

library(data.table)
setDT(df1)[, date := as.IDate(date, "%m-%d-%y")
setDT(df2)[, date := as.IDate(date, "%m-%d-%y")
df1[df2, on = .(lat, long, date < date)]
1 голос
/ 16 июня 2020

Это называется неэквивалентным соединением. Вы можете использовать пакет fuzzyjoin для этого с dplyr:

library(fuzzyjoin)
library(lubridate)
df1 <- df1 %>% mutate(date = mdy(date))
df2 <- df2 %>% mutate(date = mdy(date))

fuzzy_inner_join(df1, df2, 
                 by = c("lat" = "lat", "long" = "long", "date" = "date"),
                 match_fun = list(`==`,`==`,`<`))
# A tibble: 1 x 6
  lat.x long.x date.x     lat.y long.y date.y    
  <dbl>  <dbl> <date>     <dbl>  <dbl> <date>    
1   1.1    2.3 1970-12-04   1.1    2.3 1982-06-12
...