如何对矩阵或数据帧中的值进行混洗,以使每个值在每个行/列中仅出现一次?

问题描述

如何对矩阵或数据帧中的值进行混洗,以使每个值在R中的每一行/列中仅出现一次?

例如,这就是我所拥有的:

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

我想要什么:

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

我要么需要上下移动列并将其换行以保持输入,要么通过某种随机播放功能来完成该操作,即以一种仍可确保行不重复的方式对列进行随机播放。

解决方法

您可以尝试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,nrow = length(v)
    ),4
  )
)

给出

> out
     [,] "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"