dplyr将两个数据集与条件结合在一起

时间:2019-04-05 12:07:34

标签: r

我有两个要结合在一起的数据集。

df1如下:

        ID     date_f
1     4281 2019-02-21
2  1108827 2004-03-15
3     6201 2012-02-27
4   310158 2010-03-01
5   711065 2016-02-25
6   314808 2003-03-11
7    45012 2004-05-12
8   745732 2014-11-21
9  1458891 2013-10-28
10  316206 2007-05-30

df2如下:

     ID       date year
1  6201 1999-12-31 1999
2  6201 2000-12-31 2000
3  6201 2001-12-31 2001
4  6201 2002-12-31 2002
5  6201 2003-12-31 2003
6  6201 2004-12-31 2004
7  6201 2017-12-31 2017
8  6201 2005-12-31 2005
9  6201 2006-12-31 2006
10 6201 2007-12-31 2007
11 6201 2008-12-31 2008
12 6201 2009-12-31 2009
13 6201 2010-12-31 2010
14 6201 2011-12-31 2011
15 6201 2012-12-31 2012
16 6201 2013-12-31 2013
17 6201 2014-12-31 2014
18 6201 2015-12-31 2015
19 6201 2016-12-31 2016
20 6201 2018-12-31 2018

我正在尝试加入他们(日期不匹配):

方法:

通过IDdate < date_f的时间加入

预期输出(使用来自df1的前5个观察值:

        ID     date_f     date     year
1     4281 2019-02-21  2018-12-31  2018
2  1108827 2004-03-15  2003-12-31  2003
3     6201 2012-02-27  2011-12-31  2011
4   310158 2010-03-01  2009-12-31  2009
5   711065 2016-02-25  2015-03-31  2014

例如,上面的第2行在date_f的{​​{1}}中有一个df1,一种方法是将其与2004-03-15合并,然后与{{1 }}-但是此日期晚于year()中的日期。因此,我尝试将其与上一个日期2004-12-31合并。

最后一行5应该与df1一起加入,但是2003-12-31小于此日期。 {{1}中的2016-03-31date_f中的2016-02-25

数据

date_f

数据2

2016-03-31

2 个答案:

答案 0 :(得分:1)

我认为下面的代码可以满足您的需求。

data <- df2 %>% 
  inner_join(df1, by="ID") %>%
  filter(date < date_f) %>%
  group_by(ID) %>%
  summarise(maxDate = max(date)) %>%
  inner_join(df1, by="ID")

答案 1 :(得分:1)

一个更简单的选择是来自data.table的滚动联接

library(data.table)
setDT(df2)[, date_f := date][df1, on = .(ID, date_f), roll = Inf]
#       ID       date year     date_f
#1:    4281 2018-12-31 2018 2019-02-21
#2: 1108827 2003-12-31 2003 2004-03-15
#3:    6201 2011-12-31 2011 2012-02-27
#4:  310158 2009-12-31 2009 2010-03-01
#5:  711065 2015-03-31 2014 2016-02-25
#6:  314808 2002-12-31 2002 2003-03-11
#7:   45012 2003-12-31 2003 2004-05-12
#8:  745732 2014-01-31 2013 2014-11-21
#9: 1458891 2012-12-31 2012 2013-10-28
#10: 316206 2006-12-31 2006 2007-05-30

注意:在这里,我们假设'date / date_f'列为Date

相关问题