按组计算变量列表的总和

Ada*_*NYC 23 r data.table

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

例如,我现在的数据是

ID Count1 Count2 Count3
1   1      3      0
1   3      3      3
2   1      2      1
3   1      1      2
Run Code Online (Sandbox Code Playgroud)

我想拥有的是:

ID Count1 Count2 Count3
1   4      6      3
2   1      2      1
3   1      1      2
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法来实现这个目标.我知道我能做到:

Y <- X[, list(Count=sum(Count1), Count2=sum(Count2), Count3=sum(Count3), by = ID]
Run Code Online (Sandbox Code Playgroud)

但是,我有数百个变量,我只在列表中得到它们的名字.我该怎么办呢?

非常感谢你的帮助.

这是生成测试数据的代码:

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)
Run Code Online (Sandbox Code Playgroud)

Cha*_*ase 27

您的测试数据与您提供的示例不匹配,但无论如何 - 您可以利用data.table()具有以.SD"数据子集" 命名的运算符的事实.所以这应该有效:

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

这实际上包含在FAQ中:输入vignette("datatable-faq", package="data.table")在线查找.

  • 喜欢学习R.绝对重视简洁性而不是可读性.*当然*SD表示"数据子集".在统计分析语言中使用此缩写可能会出现什么问题?:) (5认同)

Mat*_*erg 11

由于data.table是data.frame,因此您可以使用聚合:

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

  • 但是,如果您使用的是data.table,那么您就不希望这样. (4认同)