Inner_join два кадра данных, когда год по RHS составляет 1-3 года после года по LHS - PullRequest
1 голос
/ 23 октября 2019

Я хочу объединить два кадра данных с индексом и Годом, если Год в RHS составляет 1-3 года после Года в LHS. Например, датафрейм df_lhs равен

A   index   Year
1   A   12/31/2012
3   B   12/31/2011
5   C   12/31/2009

df_rhs равен

B   index   Year
5   A   12/31/2001
6   B   12/31/2010
2   C   12/31/2011

Я надеюсь, что полученный inner_join будет содержать:

A   index   Year_left   Year_right
5   C   12/31/2009  12/31/2011

Эточто я пробовал

df = inner_join(df_lhs, df_rhs, by = c('index','Year'), suffix = c(".left", ".right"))

Код не работает. Может мне вообще не стоит думать об использовании inner_join

Ответы [ 2 ]

3 голосов
/ 23 октября 2019
library(dplyr)
library(tidyr)

df_lhs %>% 
  separate(Year, sep = "/", into = c("m", "d", "y"), remove = F) %>% 
  inner_join(., {df_rhs%>% 
                   separate(Year, sep = "/", into = c("m", "d", "y"), remove = F)}, 
             by = c('index','m', 'd'), suffix = c(".left", ".right")) %>% 
  filter((as.numeric(y.right) - as.numeric(y.left)) %in% 1:3) %>% 
  select(A, B, index, Year.left, Year.right)

#>   A B index  Year.left Year.right
#> 1 5 2     C 12/31/2009 12/31/2011
1 голос
/ 23 октября 2019

Что вы можете сделать, это сделать простое объединение / слияние, а затем отфильтровать строки, которые удовлетворяют вашему условию (здесь 1-3 года).

Ниже приведен код для объединения двух фреймов данных на основенесколько идентификаторов.

merge(df_lhs,data df_rhs,by=c("index","Year"))

После этого вы получите простое слияние, а затем сможете выполнить фильтрацию по какому-либо условию, например разнице дат между 1-3 годами.

Это всего лишь предложение. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...