1

我有一个函数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,Hdatadata.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

4

2 回答 2

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放入newColwhere isFlagis FALSE

于 2013-08-23T16:32:34.330 回答
3

您可以使用

df$result <- do.call(myFun, df)
于 2013-08-23T16:27:38.943 回答