从3个不同大小的输入矩阵构建所有可能的3列矩阵

时间:2013-03-19 22:49:24

标签: r matrix

我有三种不同的矩阵:

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的新手,所以我没有其他关于从哪里开始的想法。任何论坛可以提供的帮助将不胜感激。

2 个答案:

答案 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. 从1:5,1:4和1

  2. 创建所有有效的索引组合
  3. 计算矩阵

  4. 对于第一个问题,考虑没有公共列的合并(也称为“交叉连接”):

    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将包含一行数据框。该函数的返回值将被收集到列表中。