【问题标题】:Build all possible 3-column matrices from 3 input matrices of different sizes从 3 个不同大小的输入矩阵构建所有可能的 3 列矩阵
【发布时间】:2013-03-20 11:20:41
【问题描述】:

我有三个不同的矩阵:

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

【问题讨论】:

    标签: r matrix


    【解决方案1】:
    ## 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 非常好。我到了expand.grid,但在那段时间你把整个东西包装成一个非常好的函数
    【解决方案2】:

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

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

    2. 计算矩阵

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

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

    使用循环构建所需大小的数据框。 编辑:或者只使用 expand.grid,正如 Josh 所建议的那样。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多