访问列的数据,其中列的名称由参数传递

时间:2014-05-29 02:20:48

标签: r data.table

让我们说我想创建一个函数,它在datatable中创建所选字段的总和。即,该函数的参数包括: dtInput - 要处理的数据表, fldID - 具有唯一行ID的列, flds2Sum - 字段向量'要汇总的名字, fldsRes - 要输入结果的字段的名称。这是一个例子:

dt1 <- fread(
  "id,a,b,c,d
       id1,1,10,2,1
       id2,2,30,5,0
       id3,3,40,6,2
       id4,4,25,6,3
     ")

sumflds <- function(dtInput, fldID, flds2Sum, fldsRes) {
  dtInput[, fldsRes:={
    as.character(sum(mget(flds2Sum))) # this doesn't work correctly
  }, by=fldID, with=FALSE]
  return(dtInput);
}

dt2 <- sumflds(dt1, "id", c("c","a","d"), "res")

在我使用with=FALSE时,正确处理fldIDfldsRes等引用。但在:={}块内,我无法以所需的方式处理值。 我会很感激任何建议。

1 个答案:

答案 0 :(得分:1)

get未进行矢量化,因此您可以使用mget代替。请注意,您需要使用do.call(sum,...)。注意我已经显式复制了输入数据集,否则原始的dt1会被引用更改。我还强制使用fldsRes

评估()

在这种情况下,我认为使用.SD.SDcols更容易,例如

sumflds <- function(dtInput, fldID, flds2Sum, fldsRes) {
   copy(dtInput)[,(fldsRes) := do.call(sum,.SD), by = fldID, .SDcols = flds2Sum]
}

dt2 <- sumflds(dt1, "id", c("c","a","d"), "res")
dt2
#       id a  b c d res
# 1:   id1 1 10 2 1   4
# 2:   id2 2 30 5 0   7
# 3:   id3 3 40 6 2  11
# 4:   id4 4 25 6 3  13