[谁会偶然知道如何在R中编写数据集的改写,因此,如果我在一个数据帧中有25个数字(5行x 5列),并且我分别改写了25次,则每个数字都会准确地出现在每个位置一度?
因此,它并不是完全随机的,至少在第一次洗牌之后并不如此,因为随着每次洗牌,任何数量的潜在位置都会减少。
谢谢!
我将在3 x 3的数据集中演示该解决方案。我要做的第一件事是将data.frame转换为矩阵,以便能够轻松应用排列。
假设我们有一个3x3矩阵:
set.seed(1)
m <- matrix(sample(1:100, 9), nrow = 3)
m
#> [,1] [,2] [,3]
#> [1,] 68 34 14
#> [2,] 39 87 82
#> [3,] 1 43 59
然后可以通过数字1到9的排列来定义每个随机播放。
shuffle <- c(9, 4, 7, 1, 8, 3, 2, 5, 6)
matrix(m[shuffle], nrow = 3)
#> [,1] [,2] [,3]
#> [1,] 59 68 39
#> [2,] 34 82 87
#> [3,] 14 1 43
因此,我们的任务是生成9个这样的排列,其中每个数字在每个位置上均出现一次。例如。第一次洗牌c(9, 4, 7, 1, 8, 3, 2, 5, 6)
时,我们就不能拥有c(9, 2, 7, 3, 8, 5, 4, 6, 1)
,因为9已经在首位。
基本上我们需要的是9 x 9 latin square。幸运的是,有一个用于处理此类事情的程序包:
library(magic) #> Loading required package: abind set.seed(1) shuffles_matrix <- latin(9) shuffles_matrix #> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] #> [1,] 1 2 3 4 5 6 7 8 9 #> [2,] 9 1 2 3 4 5 6 7 8 #> [3,] 8 9 1 2 3 4 5 6 7 #> [4,] 7 8 9 1 2 3 4 5 6 #> [5,] 6 7 8 9 1 2 3 4 5 #> [6,] 5 6 7 8 9 1 2 3 4 #> [7,] 4 5 6 7 8 9 1 2 3 #> [8,] 3 4 5 6 7 8 9 1 2 #> [9,] 2 3 4 5 6 7 8 9 1
现在我们可以将此正方形的每一行都视为原始3x3矩阵的混洗:
shuffles <- split(shuffles_matrix, 1:9) shuffles #> $`1` #> [1] 1 2 3 4 5 6 7 8 9 #> #> $`2` #> [1] 9 1 2 3 4 5 6 7 8 #> #> $`3` #> [1] 8 9 1 2 3 4 5 6 7 #> #> $`4` #> [1] 7 8 9 1 2 3 4 5 6 #> #> $`5` #> [1] 6 7 8 9 1 2 3 4 5 #> #> $`6` #> [1] 5 6 7 8 9 1 2 3 4 #> #> $`7` #> [1] 4 5 6 7 8 9 1 2 3 #> #> $`8` #> [1] 3 4 5 6 7 8 9 1 2 #> #> $`9` #> [1] 2 3 4 5 6 7 8 9 1
这就是我们将这些混洗应用于矩阵的方式:
library(purrr)
shuffles %>%
map(~matrix(m[.], nrow = 3))
#> $`1`
#> [,1] [,2] [,3]
#> [1,] 68 34 14
#> [2,] 39 87 82
#> [3,] 1 43 59
#>
#> $`2`
#> [,1] [,2] [,3]
#> [1,] 59 1 43
#> [2,] 68 34 14
#> [3,] 39 87 82
#>
#> $`3`
#> [,1] [,2] [,3]
#> [1,] 82 39 87
#> [2,] 59 1 43
#> [3,] 68 34 14
#>
#> $`4`
#> [,1] [,2] [,3]
#> [1,] 14 68 34
#> [2,] 82 39 87
#> [3,] 59 1 43
#>
#> $`5`
#> [,1] [,2] [,3]
#> [1,] 43 59 1
#> [2,] 14 68 34
#> [3,] 82 39 87
#>
#> $`6`
#> [,1] [,2] [,3]
#> [1,] 87 82 39
#> [2,] 43 59 1
#> [3,] 14 68 34
#>
#> $`7`
#> [,1] [,2] [,3]
#> [1,] 34 14 68
#> [2,] 87 82 39
#> [3,] 43 59 1
#>
#> $`8`
#> [,1] [,2] [,3]
#> [1,] 1 43 59
#> [2,] 34 14 68
#> [3,] 87 82 39
#>
#> $`9`
#> [,1] [,2] [,3]
#> [1,] 39 87 82
#> [2,] 1 43 59
#> [3,] 34 14 68