【发布时间】:2021-04-21 11:34:16
【问题描述】:
我想做一些非常简单的事情,但到目前为止我还没有在一个命令中做到这一点。我想通过将函数应用于现有列的某些列来创建一个新的数据表,同时给它们一个名称并丢弃其余的列。 让我们看一个最小的例子:
library(data.table)
dt = data.table(A = c('a', 'a', 'a', 'b', 'b'),
B = c(1 , 2 , 3 , 4 , 5 ),
C = c(10 , 20 , 30 , 40 , 50))
dt
A B C
a 1 10
a 2 20
a 3 30
b 4 40
b 5 50
对于单列,我们可以这样做:
dt1 = dt[, .(totalB = sum(B)), by=A]
dt1
A totalB
a 6
b 9
对于超过 1 列,我们可以这样做:
dt2 = dt[, .(totalB = sum(B), totalC = sum(C)), by=A]
dt2
A totalB totalC
a 6 60
b 9 90
但如果列很多,那不是最佳做法。所以我想我们应该像这样使用lapply:
dt3 = dt[, lapply(.SD, sum), by = A]
dt3
A B C
a 6 60
b 9 90
创建表但没有名称。所以我们可以添加它们:
names = c("totalA", "totalB")
dt4 = dt[, c("totalA", "totalB") := lapply(.SD, sum), by = A ]
dt4
A B C totalA totalB
a 1 10 6 60
a 2 20 6 60
a 3 30 6 60
b 4 40 9 90
b 5 50 9 90
但现在这些列仍然存在。我们如何防止这种情况发生?另请注意,在我的实际问题中,我通过 SDcols 使用了列的子集,为简单起见,我没有在此处包括在内。
编辑:我想要的输出与dt2 相同,但我不想写下所有列。
【问题讨论】:
-
为什么不直接在您的 dt4 创建中选择相关列,您可以添加一个额外的
[]并选择您感兴趣的两列。 -
@hannes101 不过,我实际上对很多专栏都感兴趣。所以没那么简单。另外,直觉上,应该有一种方法可以做我想做的事情,因为它是如此接近。
标签: r data.table