R data.table条件聚合

时间:2015-01-15 01:32:55

标签: 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>)

我想基于第二列valid2列上为此数据创建条件聚合。完成聚合的方式是仅包含具有来自给定id1元素的至少一个元素的id2个组。我将逐步举例说明我的意思。

x(第一行第二列)的条件聚合将包含val的{​​{1}}值2,1,2和id1 = a值= 1,3 val因为id1 = b存在,但没有id2=x的值,导致值为2 + 1 + 2 + 1 + 3 = 9.我希望9作为第4列id1=c出现的每一行。

同样,我想对所有id2 = x值执行此操作。所以最终输出将是

id2

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

2 个答案:

答案 0 :(得分:3)

鉴于d是您的输入结构:

library(data.table)

d[,c.sum:=sum(d$val[d$id1 %in% id1]),by=id2][]

工作原理:by=id2d分组输入数据表id2; d$id1 %in% id1选择did1匹配正在考虑的小组id1的行; sum(d$val[...])从这些行中获取值的总和;最后,c.sum:=sum(...)c.sum添加了一列d。结尾[]仅用于打印目的。

输出结果为:

#    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

答案 1 :(得分:2)

这有点蛮力,但应该有效(假设data是您的数据结构):

id1_sums <- tapply(data$val,data$id1,sum)  
for(id in unique(data$id2))
    data$c.sum[data$id2  == id] <- sum(
            id1_sums[which(names(id1_sums) %in% data$id1[data$id2 == id])])