R 访问列';s数据,其中列';的名称是通过参数传递的
假设我想创建一个函数,它在datatable中生成所选字段的总和。即,此函数的参数包括: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
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")
dt1get
不是矢量化的,因此您可以使用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
(我更改了相关的代码)并没有解决问题:现在没有抛出错误,但结果是错误的:不是三列之和,我只得到三列中的第一列…太好了,非常感谢您的解决方案,尤其是对这一点的解释!