按组计算变量列表的总和

23

我有一个data.table,它只有一个关键字和大约100个数值行,其中一个被设置为关键字。我想创建一个新的变量,它包含按关键字分组的每个数值行的总和。

例如,我的数据目前是:

ID Count1 Count2 Count3
1   1      3      0
1   3      3      3
2   1      2      1
3   1      1      2

我期望的是:

ID Count1 Count2 Count3
1   4      6      3
2   1      2      1
3   1      1      2

我已经尝试了很多方法来获取这个。我知道我可以做:

Y <- X[, list(Count=sum(Count1), Count2=sum(Count2), Count3=sum(Count3), by = ID]

但是,我有数百个变量,只能在列表中获得它们的名称。 我该如何处理?

非常感谢您的帮助。

以下是生成测试数据的代码:

ID <-c(rep(210, 9), rep(3917,6))
Count1 <- c(1,1,0,1,3,1,4,1,1,1,1,1,1,0,1)
Count2 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
Count3 <- c(1,0,0,1,0,1,0,1,1,1,1,1,1,0,1)
x <- data.table(ID, Count1, Count2, Count3)
setkey(x, ID)
2个回答

27

你的测试数据与你提供的示例不匹配,但无论如何 - 你可以利用 data.table() 中名为 .SD 的运算符来获取“数据子集”。因此,以下代码应该可行:

x[, lapply(.SD, sum), by = ID]
#----
     ID Count Count2 Count3
1:  210    13      5      5
2: 3917     5      5      5

这个实际上在常见问题解答中有涵盖:输入vignette("datatable-faq", package="data.table")或者在线查看(网址)


5
喜欢学习R编程。它明显更注重简洁而不是易读性。当然,“SD”指的是“数据子集”。在使用这个缩写作为统计分析语言时可能会面临什么问题呢? :) - Duncan Babbage

11

由于data.table是一个data.frame,因此您可以使用aggregate进行此操作:

> aggregate(. ~ ID, data=x, FUN=sum)
    ID Count1 Count2 Count3
1  210     13      5      5
2 3917      5      5      5

4
但如果你使用的是 data.table,你就不会想这样做。 - mnel
可能不是。aggregate需要两倍的时间。 - Matthew Lundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接