【发布时间】:2016-12-07 21:23:56
【问题描述】:
我正在尝试按最近的前一个日期按组匹配两个数据集。 因此,在一个组中,我想将第二个数据集(d2)的变量添加到第一个数据集(d1)的变量中,当第一个数据集的日期是第二个日期或之前的最近日期时。如果第二个数据集中的两行与第一行中的一行匹配,我想添加较大的值。 (按组,d1 中的日期总是比 d2 中的日期少一个日期)
这是一个例子,希望能更清楚
d1 = data.frame(id=c(1,1,1,2,2),
ref=as.Date(c("2013-12-07", "2014-12-07", "2015-12-07", "2013-11-07", "2014-11-07" )))
d1
# id ref
# 1 1 2013-12-07
# 2 1 2014-12-07
# 3 1 2015-12-07
# 4 2 2013-11-07
# 5 2 2014-11-07
d2 = data.frame(id=c(1,1,2),
date=as.Date(c("2014-05-07","2014-12-05", "2015-11-05")),
x1 = factor(c(1,2,2), ordered = TRUE),
x2 = factor(c(2, NA ,2), ordered=TRUE))
d2
# id date x1 x2
# 1 1 2014-05-07 1 2
# 2 1 2014-12-05 2 <NA>
# 3 2 2015-11-05 2 2
预期结果
output = data.frame(id=c(1,1,1,2,2),
ref=as.Date(c("2013-12-07", "2014-12-07", "2015-12-07", "2013-11-07", "2014-11-07" )),
x1 = c(2, NA, NA, NA, 2),
x2 = c(2, NA, NA, NA, 2))
output
# id ref x1 x2
# 1 1 2013-12-07 2 2
# 2 1 2014-12-07 NA NA
# 3 1 2015-12-07 NA NA
# 4 2 2013-11-07 NA NA
# 5 2 2014-11-07 2 2
例如,d2 的前两个观测值,id=1,日期为"2014-05-07","2014-12-05",与 d1 中较早的日期"2013-12-07" 匹配。由于有两行与 d1 中的一行匹配,
然后选择最高级别。
我可以在基础 R 中通过循环以下计算来做到这一点 每个小组,但我希望有更有效的东西。 我很想看到 data.table 方法(但我仅限于 R v3.1 和 data.table v1.9.4)。谢谢
真实数据集:
d1:行 1M / 100K 组
d2:行 11K / 4K 组
# for one group
x = d1[d1$id==1, ]
y = d2[d2$id==1, ]
id = apply(outer(x$ref, y$date, "-"), 2, which.min)
temp = cbind(y, ref=x$ref[id])
# aggregate variables by ref
temp = merge(aggregate(x1 ~ ref, data=temp, max),
aggregate(x2 ~ ref, data=temp, max)
)
merge(x, temp, all=T)
ps:我查看了How to match by nearest date from two data frames? 和Join data.table on exact date or if not the case on the nearest less than date 没有成功。
【问题讨论】:
标签: r data.table