我有一个数据集x
看起来像这样:
id | date
1 | 2014-02-04
1 | 2014-03-15
2 | 2014-02-04
2 | 2014-03-15
我想通过y
和id
将其与另一个数据集date
合并。但是,对于每次观察,来自date
的{{1}}与数据集x
中的date
相同或在y
之前。数据集y
如下所示:
id | date | value
1 | 2014-02-07 | 100
2 | 2014-02-04 | 20
2 | 2014-03-22 | 80
所以我希望我的最终数据集是:
id | date.x | date.y | value
1 | 2014-02-04 | 2014-02-07 | 100
1 | 2014-03-15 | |
2 | 2014-02-04 | 2014-02-04 | 20
2 | 2014-03-15 | 2014-03-22 | 80
我真的没有如何处理类似问题的线索,我们将提供任何帮助。谢谢!
答案 0 :(得分:2)
在data.table
中使用roll
参数很容易
首先,用实际日期显示原始样本数据
library( data.table )
DT1 <- fread("id | date
1 | 2014-02-04
1 | 2014-03-15
2 | 2014-02-04
2 | 2014-03-15")
DT2 <- fread("id | date | value
1 | 2014-02-07 | 100
2 | 2014-02-04 | 20
2 | 2014-03-22 | 80")
DT1[, date := as.Date( date ) ]
DT2[, date := as.Date( date ) ]
现在,在DT1上执行更新联接,其中列date.y
和value
是DT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ]
的联接(左滚动)的结果。
此代码在id
和date
两列中合并,最后一个(即-Inf
)使用滚动参数date
。为了确保返回date
的{{1}}值,而不返回DT2
的{{1}},我们要求date
代替{{1} }(从DT1返回DT1
值)
x.date
答案 1 :(得分:0)
另一种选择是按{strong> 年&月 。
首先,我们需要添加一个附加列,以从full_join
列中提取月份和年份:
date
然后我们需要通过library(zoo)
library(dplyr)
xx <- x %>%
mutate(y_m = as.yearmon(date))
yy <- y %>%
mutate(y_m = as.yearmon(date))
和id
完全加入:
y_m