我想使用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
应用于a
和b
。
答案 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