聚合data.table滚动连接

时间:2016-12-05 17:14:06

标签: r data.table

我有两个data.table s:

library(data.table) # 1.9.6

DT1 <- data.table(id = rep(c("a", "b"), c(3, 2)),
                  x  = c(6,12,15,37,41),
                  y  = 1)
DT1[]

DT2 <- data.table(id = rep(c("a", "b"), c(4, 5)),
                  x = c(2,7,11,15,27,30, 35, 38,40))
DT2[]

我想与表格进行滚动连接,并通过引用更新DT2来自y的{​​{1}}值。这几乎可以满足我的需求:

DT1

但是,我注意到此操作后

DT2[DT1, y := y, on = c("id", "x"), roll = -Inf]
DT2[]

DT2[4] ,而如果我滚动连接a)没有y = 1的第2行或没有DT1的第3行,我总是得到相同的结果,因为在这两种情况下,DT1中的y连接到DT1中的第4行 - 例如:

DT2

我希望得到的结果是

DT2[, y:= NULL]
DT2[DT1[!2], y := y, on = c("id", "x"), roll = -Inf]
DT2[]
DT2[, y:= NULL]
DT2[DT1[!3], y := y, on = c("id", "x"), roll = -Inf]
DT2[]

即。如果连接导致&#34; cell&#34;中的多个值,我想要总/聚合值。这可以使用DT2[4, y := 2][] 滚动连接和按引用更新功能吗?

1 个答案:

答案 0 :(得分:2)

一个丑陋的解决方法是构建聚合表,然后第二次合并:

agg = DT2[DT1, on=.(id, x), roll=-Inf, .(id, x = x.x, y = i.y)][, sum(y), by=.(id, x)]

DT2[agg, on=.(id, x), roll=-Inf, y := i.V1 ]
我认为

There's an open FR允许DT2[DT1, on=.(id,x), y := sum(i.y), by=x.x]