R data.table 条件聚合
R data.table conditional aggregation
我面临(我认为)是 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>)
我想根据第二列 id2
在 val
列上为该数据创建条件聚合。完成聚合的方式是仅包括 id1
组,这些组至少具有给定 id2
元素中的一个元素。我将通过一个示例来说明我的意思。
x
(第一行第二列)的条件聚合将包括 val
值 2,1,2,对于 id1 = a
和 val
值 = 1,来自 id1 = b
的 3 因为 id2=x
存在于它们但没有来自 id1=c
的值,导致值为 2 + 1 + 2 + 1 + 3 = 9。我想要 9 作为第 4 个每行中出现 id2 = x
的列。
同样,我想对所有 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
这在 R 中可行吗,data.table?或者其他 package/method?
提前致谢
鉴于 d
是您的输入结构:
library(data.table)
d[,c.sum:=sum(d$val[d$id1 %in% id1]),by=id2][]
工作原理:by=id2
按 id2
对输入数据 table d
进行分组; d$id1 %in% id1
选择 d
中的行,其 id1
与正在考虑的组的 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
这有点蛮力,但应该可以(假设 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])])
我面临(我认为)是 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>)
我想根据第二列 id2
在 val
列上为该数据创建条件聚合。完成聚合的方式是仅包括 id1
组,这些组至少具有给定 id2
元素中的一个元素。我将通过一个示例来说明我的意思。
x
(第一行第二列)的条件聚合将包括 val
值 2,1,2,对于 id1 = a
和 val
值 = 1,来自 id1 = b
的 3 因为 id2=x
存在于它们但没有来自 id1=c
的值,导致值为 2 + 1 + 2 + 1 + 3 = 9。我想要 9 作为第 4 个每行中出现 id2 = x
的列。
同样,我想对所有 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
这在 R 中可行吗,data.table?或者其他 package/method? 提前致谢
鉴于 d
是您的输入结构:
library(data.table)
d[,c.sum:=sum(d$val[d$id1 %in% id1]),by=id2][]
工作原理:by=id2
按 id2
对输入数据 table d
进行分组; d$id1 %in% id1
选择 d
中的行,其 id1
与正在考虑的组的 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
这有点蛮力,但应该可以(假设 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])])