【问题标题】:Apply family of functions for functions with multiple arguments将函数族应用于具有多个参数的函数
【发布时间】:2014-03-15 22:30:28
【问题描述】:

我想使用 apply 系列中的一个函数(在 R 中)将一个包含两个参数的函数应用于两个矩阵。我认为这是可能的。我对么?否则,我似乎必须将两个矩阵合二为一,并根据新矩阵重新定义我的函数。

这是我想做的一个例子:

a <- matrix(1:6,nrow = 3,ncol = 2)
b <- matrix(7:12,nrow = 3,ncol = 2)

foo <- function(vec1,vec2){
    d <- sample(vec1,1)
    f <- sample(vec2,1)
    result <- c(d,f)
return(result)
}

我想将foo 申请到ab

【问题讨论】:

  • 请用您使用的语言标记您的问题。
  • 糟糕,感谢您的提醒。
  • 我不清楚您希望函数做什么以及如何将矩阵连接到函数的输入。你只是说你想从每个矩阵的每一行中获取一个样本吗?为什么需要同时对两个矩阵执行此操作?
  • 或者您想从每一列中获取样本?请更新您的问题,以更清楚地说明您的实际期望。
  • 你提出了一个很好的观点。我绝对可以让它成为一个参数的函数,并分别执行所需的操作,然后像我在result 中那样组合它们。出于我的实际目的,这已经足够了。但是,我正在努力变得更加精通 apply 系列,所以我仍然对我提出的问题的解决方案感兴趣。

标签: r apply


【解决方案1】:

(严格回答问题,而不是为您在这里特别使用的更好的方法....)

mapply*apply 系列函数中的函数,用于在循环多个参数时应用函数。

因此,您在这里要做的是将每个矩阵转换为包含其行或列的向量列表(您没有指定)。有很多方法可以做到这一点,我喜欢使用以下功能:

split.array.along <- function(X, MARGIN) {
    require(abind)
    lapply(seq_len(dim(X)[MARGIN]), asub, x = X, dims = MARGIN)
}

那么你所要做的就是运行:

mapply(foo, split.array.along(a, 1),
            split.array.along(b, 1))

sapply 一样,mapply 会尽可能将您的输出放入一个数组中。如果您希望输出是一个列表,请将SIMPLIFY = FALSE 添加到mapply 调用中,或者等效地使用Map function:

Map(foo, split.array.along(a, 1),
         split.array.along(b, 1))

【讨论】:

    【解决方案2】:

    您可以调整foo 以采用一个参数(单个矩阵),并在函数体中使用apply
    然后你可以在foo 上使用lapply 从每个矩阵的每一列中采样。

    > a <- matrix(1:6,nrow = 3,ncol = 2)
    > b <- matrix(7:12,nrow = 3,ncol = 2)
    
    > foo <- function(x){
        apply(x, 2, function(z) sample(z, 1))
      }
    
    > lapply(list(a, b), foo)
    
    ## [[1]]
    ## [1] 1 6
    
    ## [[2]]
    ## [1]  8 12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多