Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 访问列';s数据,其中列';的名称是通过参数传递的_R_Data.table - Fatal编程技术网

R 访问列';s数据,其中列';的名称是通过参数传递的

R 访问列';s数据,其中列';的名称是通过参数传递的,r,data.table,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 ") s

假设我想创建一个函数,它在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")

dt1
get
不是矢量化的,因此您可以使用
mget
。请注意,您需要使用
do.call(sum,…)
。注意:我已明确复制了输入数据集,否则原始的
dt1
将通过引用进行更改。我还使用
()

在这种情况下,我认为更容易使用
.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

sumflds我假设使用
get
将正确引用该列。可能重复感谢您指出!然而,简单的介绍
get
(我更改了相关的代码)并没有解决问题:现在没有抛出错误,但结果是错误的:不是三列之和,我只得到三列中的第一列…太好了,非常感谢您的解决方案,尤其是对这一点的解释!