2013-03-19 60 views
4

我有三个不同的矩阵:构建不同规模的3点输入矩阵的所有可能的3列矩阵

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(我已经尝试过的溶液)似乎没有工作。

我尝试了六种不同的循环,但他们中没有一个能够完成我想要的功能,而且我使用了一些排列功能,但无法弄清楚如何使它们在这种情况下工作。

最终,我试图对未知数量的输入矩阵做到这一点,由于我还是R新手,对于从哪里开始我没有其他想法。任何帮助论坛可以提供将不胜感激。

回答

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) 
+2

+1非常好。我得到了expand.grid,但在那个时候,你把所有东西都包装成了一个很好的功能 – 2013-03-19 23:16:56

+0

它完美的工作!谢谢您的帮助。 – user2047457 2013-03-20 16:19:49

1

它看起来像你的问题可以分成两个部分:

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

  2. 计算矩阵

对于第一个问题,可以考虑不具有共同的列(也称为“交叉联接”)合并:

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

使用循环来构建一个尽可能大的数据帧。 编辑:或者只是使用expand.grid,如乔希所建议的。

对于第二个问题,来自plyr包的alply函数将很有用。它允许处理由行的矩阵/数据帧的行和收集在一个列表中的结果(矩阵中的情况下的列表):

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

combinations是由expand.grid或类似物所产生的数据帧。该函数将针对每个索引组合调用一次,x将包含一行数据框。该函数的返回值将被收集到一个列表中。