R data.table条件聚合

bro*_*oli 7 r data.table

我面临着(我认为)这是一个棘手的问题,关于data.table 我的以下内容 data.table

structure(list(id1 = c("a", "a", "a", "b", "b", "c", "c"), id2 = c("x", 
"y", "z", "x", "u", "y", "z"), val = c(2, 1, 2, 1, 3, 4, 3)), .Names = c("id1", 
"id2", "val"), row.names = c(NA, -7L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x1f66a78>)
Run Code Online (Sandbox Code Playgroud)

我想val基于第二列在列的数据上创建条件聚合id2.完成聚合的方式是仅包括id1具有来自给定id2元素的至少一个元素的组.我将通过一个例子来说明我的意思.

x(第一行第二列)的条件聚合将包括val值2,1,2 for id1 = avalvalues = 1,3 from id1 = b 因为id2=x它们存在但没有值来自id1=c,导致值为2 + 1 + 2 + 1 + 3 = 9.我希望9 id2 = x出现在每一行的第4列.

同样,我想为所有id2值执行此操作.所以最终的输出就是

    id1 id2 val c.sum
1:   a   x   2     9
2:   a   y   1    12
3:   a   z   2    12
4:   b   x   1     9
5:   b   u   3     4
6:   c   y   4    12
7:   c   z   3    14
Run Code Online (Sandbox Code Playgroud)

这在R,data.table中是否可行?或任何其他包/方法?提前致谢

Mar*_*pov 5

鉴于这d是您的输入结构:

library(data.table)

d[,c.sum:=sum(d$val[d$id1 %in% id1]),by=id2][]
Run Code Online (Sandbox Code Playgroud)

工作原理:按;对by=id2输入数据表进行分组 选择与所考虑的组匹配的行;从这些行中获取值的总和;最后,向 中添加一列。仅出于打印目的才需要结尾。did2d$id1 %in% id1did1id1sum(d$val[...])c.sum:=sum(...)c.sumd[]

输出是:

#    id1 id2 val c.sum
# 1:   a   x   2     9
# 2:   a   y   1    12
# 3:   a   z   2    12
# 4:   b   x   1     9
# 5:   b   u   3     4
# 6:   c   y   4    12
# 7:   c   z   3    12
Run Code Online (Sandbox Code Playgroud)