【问题标题】:Shuffle column values but keep the same matrix column ordering随机排列列值但保持相同的矩阵列顺序
【发布时间】:2014-09-06 08:02:40
【问题描述】:

如何在每列中随机排列矩阵 m1 的值:

首字母:

m1=cbind(c(1,2,3),c(4,5,6),c(7,8,9))

做某事并且:

m1=cbind(c(7,5,3),c(4,2,9),c(1,8,6))

谢谢

【问题讨论】:

    标签: r matrix shuffle


    【解决方案1】:

    您可以在矩阵的每一列上调用sample 函数来对其进行洗牌:

    set.seed(100)
    apply(m1, 2, sample)
    #      [,1] [,2] [,3]
    # [1,]    1    5    8
    # [2,]    3    4    9
    # [3,]    2    6    7
    

    【讨论】:

    • 我想要的是洗牌每列的行值,所以对于第 1 列,我洗牌值 1,4 和 7。
    • @jpcgandre 在您问题的示例中,您似乎只是对每一行进行了洗牌(也许您的意思是rbind 而不是cbind 用于第二个片段?)。您是说您想改组第 1 行并将其存储在第 1 列中,将第 2 行改组并将其存储在第 2 列中,等等?如果是这样,只需从我的代码中删除 t
    • 我已经测试过了,它不起作用。结果如下:> m1=cbind(c(1,2,3),c(4,5,6),c(7,8,9)) > m2 <- apply(m1, 1, sample) > m1 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > m2 [,1] [,2] [,3] [1,] 7 5 6 [2,] 4 8 3 [3,] 1 2 9
    • @jpcgandre 对不起——我正在尽我所能理解你想要什么,但如果没有更完整的问题示例,这将非常困难。显然,“我如何在每列中对矩阵 m1 的行值进行洗牌”并不足以描述您想要的内容。如果你不想打乱行,也不想打乱行然后转置,你到底想要什么?
    • 我想要for (i in 1:ncol(m1)) m1[,i] <- m1[order(runif(length(m1[i,]))),i]这样的东西。
    【解决方案2】:

    嗯,你的意思是在你的例子中的行?!

    随机播放列表:

    # create a list from 1 to 9
    x <- seq(1,9)
    # shuffle
    x[order(runif(length(x)))]
    

    随机排列矩阵的行/列:

    # example matrix
    m1 <- matrix(x,ncol=3)
    # shuffle by row
    for (i in 1:nrow(m1)) m1[i,] <- m1[i,order(runif(length(m1[i,])))]
    # shuffle by col
    for (i in 1:ncol(m1)) m1[,i] <- m1[order(runif(length(m1[i,]))),i]
    

    编辑:也许sample 更好...http://stat.ethz.ch/R-manual/R-devel/library/base/html/sample.html

    【讨论】:

      【解决方案3】:

      您还可以将sample 放入矩阵索引中并对行和列进行采样。

      洗牌整​​个矩阵,

      > m1[sample(nrow(m1)), sample(ncol(m1))]
      #     [,1] [,2] [,3]
      #[1,]    6    9    3
      #[2,]    5    8    2
      #[3,]    4    7    1
      

      或按行

      > m1[sample(nrow(m1)), ]
      #     [,1] [,2] [,3]
      #[1,]    3    6    9
      #[2,]    1    4    7
      #[3,]    2    5    8
      

      或按列

      > m1[,sample(ncol(m1))]
      #     [,1] [,2] [,3]
      #[1,]    7    4    1
      #[2,]    8    5    2
      #[3,]    9    6    3
      

      【讨论】:

      • m1[sample(nrow(m1)), ] 有点工作,但它保持每行相同的值,而 for (i in 1:ncol(m1)) m2[,i] &lt;- m1[order(runif(length(m1[i,]))),i] 真正打乱同一列中的值。
      • 您需要更具体地了解您想要的结果。
      • 我只想在每列中随机排列矩阵 m1 的值。所以随机播放 (1,4,7), (2,5,8) 和 (3,6,9)。
      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多