我有一个带有一个键和大约100个数字行的data.table,其中一个设置为key。我想创建一个新变量,它包含按键分组的每个数字行的总和。
例如,我现在的数据是
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)
答案 0 :(得分: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")
或找到它online。
答案 1 :(得分: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