【问题标题】:R Random Selection of Matrix Cells and LoopR随机选择矩阵单元和循环
【发布时间】:2015-07-13 16:22:22
【问题描述】:

我有两个 3x3 矩阵,我想从每一行中随机选择一个项目(两个矩阵中的相同对应项目)并将这些“选定”值记录在一个新矩阵中。

从那里我想重复这个过程 5 次,每次都添加到矩阵中,这样最后我就有了一个 3x10 随机选择值的矩阵。

我会尝试说明我的意思:

我有 2 个矩阵 A 和 B。

> A = matrix( c(4,7,1,9,4,2,1,3,9), nrow = 3, ncol = 3)
> A
     [,1] [,2] [,3]
[1,]    4    9    1
[2,]    7    4    3
[3,]    1    2    9
> B = matrix( c(2, 4, 3, 1, 5, 7, 4, 3, 2), nrow=3, ncol=3) 
> B
     [,1] [,2] [,3] 
[1,]    2    1    4
[2,]    4    5    3
[3,]    3    7    2

然后我想随机选择一个介于 1 和 3 之间的整数(因为每个矩阵中有 3 列)

> random <- sample(1:3, length)
> random
[1] 1 3 2

由于数字是 1,3 和 2,我想从矩阵 A 和 B 中创建第 1 行的第 1 个元素、第 2 行的第 3 个元素和第 3 行的第 2 个元素的向量。这个将是新的矩阵 C。

> C = matrix(c(4,3,2,2,3,7), nrow = 3, ncol = 2)
> C
     [,1] [,2]
[1,]    4    2
[2,]    3    3
[3,]    2    7

在此之后,我想循环该过程 5 次,每次将生成的矩阵添加到现有的“C”矩阵的一侧。

我是 R 的初学者,所以我的问题是:如何结合随机选择和循环来创建所需的结果?非常感谢任何帮助或建议,谢谢。

(我想在更大的范围内重新创建它)

【问题讨论】:

    标签: r loops matrix random selection


    【解决方案1】:

    你可以试试

    M <- cbind(c(t(A)), c(t(B)))
    fnc <- function(){
      n <- nrow(A)
      ind <- sample(n) + (1:n-1)*n
      M[ind, ]
    }
    set.seed(0)
    do.call(cbind, lapply(1:5, function(i)fnc()))
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]    1    4    9    1    1    4    9    1    4     2
    # [2,]    7    4    3    3    4    5    7    4    4     5
    # [3,]    2    7    1    3    1    3    9    2    9     2
    

    【讨论】:

    • 非常好和快速+1
    • @nongkrong 谢谢。已编辑以反映您的建议。
    • @ExperimenteR 谢谢。完美运行!
    • @ExperimentR 如果矩阵不是正方形,我将如何更改代码?例如,假设它是一个 3x2 矩阵?
    • 将索引变量更改为ind &lt;- sample(n) + (1:n-1)*ncol(A)