如何避免列出函数参数但仍然是子集?

时间:2013-08-23 16:23:46

标签: r data.table

我有一个函数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,Hdata的列名。我正在使用data.tabledata.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

2 个答案:

答案 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 isFlagFALSE的位置。

答案 1 :(得分:3)

您可以使用

df$result <- do.call(myFun, df)