我有一个函数myFun(a,b,c,d,e,f,g,h)
,其中包含其参数的矢量化表达式。
我想添加一个新列:data$result <- with(data, myFun(A,B,C,D,E,F,G,H))
其中A,B,C,D,E,F,G,H
是data
的列名。我正在使用data.table
但data.frame
的答案也很受欢迎。
到目前为止,参数列表(列名称)输入可能很乏味,我想提高可读性。还有更好的方法吗?
> myFun <- function(a,b,c) a+b+c
> dt <- data.table(a=1:5,b=1:5,c=1:5)
> with(dt,myFun(a,b,c))
[1] 3 6 9 12 15
我想做的最终事情是:
dt[isFlag, newCol:=myFun(A,B,C,D,E,F,G,H)]
然而:
> dt[a==1,do.call(myFun,dt)]
[1] 3 6 9 12 15
请注意,j
表达式似乎忽略了该子集。结果应该只是3
。
答案 0 :(得分:4)
暂时忽略子集方面:df$result <- do.call("myFun", df)
。但是,这会复制整个df
,而data.table
则允许您按引用添加列:df[,result:=myFun(A,B,C,D,E,F,G,H)]
。
要包含来自@Eddi的评论(我不知道如何轻松地将这些操作合并到data.frame
中):
dt[isFlag, newCol := do.call(myFun, .SD)]
请注意,即使您不进行分组,也可以使用.SD
,只需进行子集化。
或者,如果你的函数实际上只是将其参数添加到一起:
dt[isFlag, newCol := do.call(sum, .SD)]
这会自动将NA
放入newCol
isFlag
为FALSE
的位置。
答案 1 :(得分:3)
您可以使用
df$result <- do.call(myFun, df)