我已经习惯了data.tables,似乎无法找到感觉如此简单(或者至少是数据框)的答案。
我想使用data.table进行聚合,但是,我并不总是知道要提前聚合哪一列(它需要用户输入)。我想根据字符向量定义要使用的列。以下是我想要做的简短示例:
require(data.table)
myDT <- data.table(a = 1:10, b = 11:20, n1 = c("first", "second"))
aggWith <- "a"
现在我想使用aggWith对象来定义要汇总的列。这不起作用:
> myDT.Agg <- myDT[, .(Agg = sum(aggWith)), by = .(n1)]
Error in sum(aggWith) : invalid 'type' (character) of argument
这也不是:
> myDT.Agg <- myDT[, .(Agg = sum(aggWith)), by = .(n1), with = FALSE]
Error in sum(aggWith) : invalid 'type' (character) of argument
这样做:
myDT.Agg <- myDT[, .(Agg = sum(a)), by = .(n1)]
但是,我希望能够根据字符向量来定义哪个列“a”是任意的。我正在浏览?data.table,但我只是没有看到我需要的东西。提前抱歉,如果这很简单,我只是忽略了一些东西。
答案 0 :(得分:4)
我们可以指定&#39; aggWith&#39;作为.SDcols
,然后获取sum
.SD
myDT[, list(Agg= sum(.SD[[1L]] )), by = n1, .SDcols=aggWith]
如果有多列,请使用lapply
myDT[, lapply(.SD, sum), by = n1, .SDcols= aggWith]
另一种选择是使用eval(as.name
myDT[, list(Agg= sum(eval(as.name(aggWith)))), by = n1]