我有三种不同的矩阵:
m1, which has 12 rows and 5 columns;
m2, which has 12 rows and 4 columns; and
m3, which has 12 rows and 1 column.
我正在尝试从此构建一系列3列矩阵(p1到p20),这样在每个p矩阵中:
p[,1] is taken from m1,
p[,2] is taken from m2, and
p[,3] is taken from m3.
我希望这个过程是详尽无遗的,因此我创建了所有20个可能的3列矩阵,因此采样m1,m2和m3(我已经尝试过的解决方案)似乎不起作用。
我尝试了六个不同的for循环,但没有一个完成我想要的东西,我玩了一些排列函数,但无法弄清楚如何使它们在这种情况下工作。
最终,我正在尝试为未知数量的输入矩阵执行此操作,并且因为我还是R的新手,所以我没有其他关于从哪里开始的想法。任何论坛可以提供的帮助将不胜感激。
答案 0 :(得分:6)
## Example matrices
m1 <- matrix(1:4, nrow=2)
m2 <- matrix(1:6, nrow=2)
m3 <- matrix(1:2, nrow=2)
## A function that should do what you're after
f <- function(...) {
mm <- list(...)
ii <- expand.grid(lapply(mm, function(X) seq_len(ncol(X))))
lapply(seq_len(nrow(ii)), function(Z) {
mapply(FUN=function(X, Y) X[,Y], mm, ii[Z,])
})
}
## Try it out
f(m1)
f(m1,m2)
f(m1,m2,m3)
答案 1 :(得分:1)
看起来您的问题可以分为两部分:
从1:5,1:4和1
计算矩阵
对于第一个问题,考虑没有公共列的合并(也称为“交叉连接”):
merge(data.frame(a=1:5), data.frame(a=1:4), by=c())
使用循环构建您需要的数据框。 编辑:或者按照Josh的建议使用expand.grid
。
对于第二个问题,alply
包中的plyr
函数将非常有用。它允许逐行处理矩阵/数据帧并在列表中收集结果(在您的情况下为矩阵列表):
alply(combinations, 1, function(x) { ... })
combinations
是由expand.grid
等生成的数据框。对于每个索引组合,将调用该函数一次,x
将包含一行数据框。该函数的返回值将被收集到列表中。