R 如何在矩阵或数据帧中洗牌值,使每个值在每行/每列中只出现一次?

R 如何在矩阵或数据帧中洗牌值,使每个值在每行/每列中只出现一次?,r,matrix,shuffle,sample,shift,R,Matrix,Shuffle,Sample,Shift,如何在矩阵或数据帧中洗牌值,使每个值在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中的每行/每列中只出现一次

例如,以下是我所拥有的:

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

我需要上下移动列并将其包装以保持输入,或者通过某种洗牌功能来洗牌列,以确保行不会重复。

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

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

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

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
  )
)

您好,您的问题似乎不是关于R的问题。在询问如何在“R”中洗牌之前,您应该详细说明洗牌的确切含义。例如,您将如何在另一种编程语言中实现它?基本上,您正在尝试构造一个,因此您应该寻找构造拉丁方的算法。我使用的示例不是最精确的,因为我的实际数据不是一个方,而是一个4x30矩阵,5列中的每列都有1:30的数字。您的代码工作得很好,但它将我的数据缩减为4x4矩阵,而不是洗牌或移动所有数据
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"