【问题标题】:Randomly re-order (shuffle) rows of a matrix?随机重新排序(洗牌)矩阵的行?
【发布时间】:2012-02-23 06:54:08
【问题描述】:

我想随机重新排序矩阵 A 的行以生成另一个新矩阵。如何在 R 中做到这一点?

【问题讨论】:

  • 我认为“重新排序行”是指A 的行,而A 真的是一个矩阵吗?最后一点无关紧要,因为我的答案也适用于数据框,但只是为了清楚您拥有什么。
  • 加文,感谢您的回答。一个更通用的场景是有没有办法随机重新排序输入数据文件的行?
  • 是的 - 这是我在下面向您展示的那个。它适用于数据帧,这将是读入的大部分数据将被格式化的方式。

标签: r matrix random rows shuffle


【解决方案1】:

使用sample() 以(伪)随机顺序生成行索引,并使用[ 重新排序矩阵。

## create a matrix A for illustration
A <- matrix(1:25, ncol = 5)

给予

> A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25

接下来,为行生成随机顺序

## generate a random ordering
set.seed(1) ## make reproducible here, but not if generating many random samples
rand <- sample(nrow(A))
rand

这给出了

> rand
[1] 2 5 4 3 1

现在用它来重新排序A

> A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25
> A[rand, ]
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    7   12   17   22
[2,]    5   10   15   20   25
[3,]    4    9   14   19   24
[4,]    3    8   13   18   23
[5,]    1    6   11   16   21

【讨论】:

    【解决方案2】:

    使用 tidyverse,您可以使用单线进行随机播放:

    A %>% sample_n(nrow(.))
    

    这仅适用于数据框或小标题,因此您需要将 A 设为:

    A <- tibble(1:25, ncol = 5)
    A %>% sample_n(nrow(.))
    
    # A tibble: 25 x 2
       `1:25`  ncol
        <int> <dbl>
     1      9     5
     2      6     5
     3      4     5
     4     15     5
     5     14     5
     6      3     5
     7     23     5
     8     25     5
     9     17     5
    10     19     5
    # … with 15 more rows
    

    【讨论】:

    • 截至 2021 年,现在是 A %&gt;% slice_sample(n = nrow(.))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多