【问题标题】:How to shuffle values in a matrix or data frame so that each value only occurs once in each row/column?如何对矩阵或数据框中的值进行混洗,以使每个值在每行/列中仅出现一次?
【发布时间】:2020-10-07 09:59:00
【问题描述】:

如何打乱矩阵或数据框中的值,使每个值在 R 的每一行/列中只出现一次?

例如,这是我所拥有的:

A, A, A, A
B, B, B, B
C, C, C, C
D, D, D, D
E, E, E, E
F, F, F, F
G, G, G, G

我想要什么:

A, B, C, D
B, C, D, E
C, D, E, F
D, E, F, G
E, F, G, A
F, G, A, B
G, A, B, C

我要么需要向上/向下移动列并将其换行以维护我的输入,要么通过某种洗牌函数来洗牌,以确保行不重复的方式洗牌。

【问题讨论】:

  • 嗨,您的问题似乎并不是关于 R 的问题。在询问如何在“R”中随机播放之前,您应该明确您对随机播放的含义。例如,您将如何使用另一种编程语言来实现?基本上,您正在尝试构建Latin square,因此您应该寻找构建拉丁方阵的算法。

标签: r matrix shuffle sample shift


【解决方案1】:

您可以尝试outer + %% 产生循环移位

v <- LETTERS[1:4]
out <- matrix(
  v[outer(seq_along(v) - 1, seq_along(v) - 1, `+`) %% length(v) + 1],
  nrow = length(v)
)

这样

> out
     [,1] [,2] [,3] [,4]
[1,] "A"  "B"  "C"  "D"
[2,] "B"  "C"  "D"  "A"
[3,] "C"  "D"  "A"  "B"
[4,] "D"  "A"  "B"  "C"

更新 如果你的矩阵不是正方形的,你可以试试下面的代码

v <- LETTERS[1:7]
out <- t(
  head(
    matrix(
      v[outer(seq_along(v) - 1, seq_along(v) - 1, `+`) %% length(v) + 1],
      nrow = length(v)
    ), 4
  )
)

给了

> out
     [,1] [,2] [,3] [,4]
[1,] "A"  "B"  "C"  "D"
[2,] "B"  "C"  "D"  "E"
[3,] "C"  "D"  "E"  "F" 
[4,] "D"  "E"  "F"  "G"
[5,] "E"  "F"  "G"  "A"
[6,] "F"  "G"  "A"  "B"
[7,] "G"  "A"  "B"  "C"

【讨论】:

  • 我使用的示例不是最准确的,因为我的实际数据不是正方形,它是一个 4x30 矩阵,其 5 列中的每一列都有 1:30 的数字。您的代码效果很好,但它将我的数据缩减为 4x4 矩阵,而不是改组或移动所有数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2020-05-24
  • 2013-08-11
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多