为具有多个参数的函数应用函数族

时间:2014-03-15 22:30:29

标签: r apply

我想使用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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

> 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