应用具有多个参数的函数

时间:2017-01-18 08:21:49

标签: r data.table

我想将函数应用于具有多个参数的数据表。

假设:

dt<-as.data.table(matrix(c(201,202,201,201,202,202,4,6,9,2,4,5,6,9,7,3,2,1), nrow = 6, ncol = 3, byrow = FALSE))

    V1 V2 V3
1: 201  4  6
2: 202  6  9
3: 201  9  7
4: 201  2  3
5: 202  4  2
6: 202  5  1

我想应用一个带3个参数的函数。为了简单起见,让我们总结一下。

显然解决方案不是dt[,sum:=V1+V2+V3]

如果我以下列方式传递第二和第三个参数,它就不起作用。

dt[,sum:=lapply(V1,function(x,y,z) x+y+z,y=V2,z=V3)]

应用具有多个参数的函数的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

mapply()允许您使用参数的相应位置将多个向量作为参数循环。

dt[,sum:=mapply(function(x,y,z) x+y+z, V1, V2, V3)]

   V1 V2 V3 sum
1: 201  4  6 211
2: 202  6  9 217
3: 201  9  7 217
4: 201  2  3 206
5: 202  4  2 208
6: 202  5  1 208

答案 1 :(得分:3)

我们可以将Reduce+

一起使用
dt[, Sum := Reduce(`+`, .SD)]
dt
#    V1 V2 V3 Sum
#1: 201  4  6 211
#2: 202  6  9 217
#3: 201  9  7 217
#4: 201  2  3 206
#5: 202  4  2 208
#6: 202  5  1 208

如果有多个参数,则一个选项为Map do.call。创建感兴趣的函数(&#39; f1&#39;),然后在.SDcols中指定将作为参数的列,使用do.call作为参数使用Map,指定函数&#39; f1&#39;,unlist输出并将其分配(:=)到&#39; Sum&#39;

f1 <- function(x, y, z)  x + y + z    
dt[, Sum := unlist(do.call(Map, c(f=f1, unname(.SD)))), .SDcols = V1:V3]