R:在日期范围内合并两个数据集

时间:2019-11-10 16:10:18

标签: r

我有一个数据集x看起来像这样:

id  |      date
 1  |   2014-02-04
 1  |   2014-03-15
 2  |   2014-02-04
 2  |   2014-03-15

我想通过yid将其与另一个数据集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

我真的没有如何处理类似问题的线索,我们将提供任何帮助。谢谢!

2 个答案:

答案 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.yvalueDT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ]的联接(左滚动)的结果。
此代码在iddate两列中合并,最后一个(即-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