我想将函数应用于具有多个参数的数据表。
假设:
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)]
应用具有多个参数的函数的正确方法是什么?
答案 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]