使用数据表从字符向量定义列

时间:2015-12-04 17:29:09

标签: r data.table

我已经习惯了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,但我只是没有看到我需要的东西。提前抱歉,如果这很简单,我只是忽略了一些东西。

1 个答案:

答案 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]