4

我有三个不同的矩阵:

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

4

2 回答 2

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)
于 2013-03-19T23:15:01.957 回答
1

看起来您的问题可以分为两部分:

  1. 从 1:5、1:4 和 1 创建所有有效的索引组合

  2. 计算矩阵

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

merge(data.frame(a=1:5), data.frame(a=1:4), by=c())

使用循环构建所需大小的数据框。编辑:或者只是使用expand.gridJosh 建议的。

对于第二个问题,包中的alply函数plyr将很有用。它允许逐行处理矩阵/数据框并将结果收集在列表中(在您的情况下为矩阵列表):

alply(combinations, 1, function(x) { ... })

combinations是由等生成的数据帧expand.grid。该函数将为每个索引组合调用一次,x将包含一行的数据框。该函数的返回值将被收集到一个列表中。

于 2013-03-19T23:19:26.673 回答