让我们说我想创建一个函数,它在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
时,正确处理fldID
和fldsRes
等引用。但在:={}
块内,我无法以所需的方式处理值。
我会很感激任何建议。
答案 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