【问题标题】:Applying function with more than 1 arguments [duplicate]应用具有多个参数的函数[重复]
【发布时间】:2017-01-18 08:21:49
【问题描述】:

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

假设:

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)]

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

【问题讨论】:

  • 这些不一样,因为我的问题不是取行和。我的问题是应用具有多个参数的函数。

标签: r data.table


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我们可以使用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
    

    如果有多个参数,一个选项是Mapdo.call。创建感兴趣的函数('f1'),然后在.SDcols 中指定将作为参数的列,使用do.callMap 作为参数,指定函数'f1',unlist 输出并分配(:=) 它是“总和”

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

    【讨论】:

    • 这仅适用于 sum 情况,如果您想应用具有 3 个参数的函数而不是使用关联的两个参数函数进行归约,这将不起作用。
    • @snaut 它也适用于*,即dt[, Reduce(*, .SD)]
    • 抱歉+ 太具体了,* 是一个关联的、两个参数的操作。
    • @snaut 我为你提到的情况添加了另一个版本的mapply
    猜你喜欢
    • 2015-04-25
    • 2011-10-13
    • 1970-01-01
    • 2019-01-02
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多