只需sample()单独使用行数和列数,然后使用结果索引sample().
df <- data.frame(matrix(1:25, ncol = 5))
permDF <- function(x) {
nr <- nrow(x)
nc <- ncol(x)
x[sample(nr), sample(nc)]
}
> permDF(df)
X3 X4 X2 X1 X5
4 14 19 9 4 24
5 15 20 10 5 25
1 11 16 6 1 21
3 13 18 8 3 23
2 12 17 7 2 22
> permDF(df)
X1 X2 X4 X3 X5
2 2 7 17 12 22
4 4 9 19 14 24
1 1 6 16 11 21
3 3 8 18 13 23
5 5 10 20 15 25
Run Code Online (Sandbox Code Playgroud)
请注意,这会将行和列中的值保持在一起,但列和行的顺序不同.如果您希望数据集完全随机化,那么数据框的方法就不那么简单了.我会用矩阵来做这件事,但它需要更多的工作,正如@DWin所示
mat <- matrix(1:25, ncol = 5)
pmat <- mat
set.seed(42)
pmat[] <- mat[sample(length(mat))]
pmat
> pmat
[,1] [,2] [,3] [,4] [,5]
[1,] 23 11 24 10 5
[2,] 25 21 20 9 8
[3,] 7 3 13 1 18
[4,] 19 12 4 16 2
[5,] 14 17 6 15 22
Run Code Online (Sandbox Code Playgroud)
你可以用与矩阵相同的方式对数据框做我正在做的事情,使用与上面的索引略有不同的索引
mat[sample(nrow(mat)), sample(ncol(mat))]
> set.seed(42)
> mat[sample(nrow(mat)), sample(ncol(mat))]
[,1] [,2] [,3] [,4] [,5]
[1,] 15 25 5 10 20
[2,] 14 24 4 9 19
[3,] 11 21 1 6 16
[4,] 12 22 2 7 17
[5,] 13 23 3 8 18
Run Code Online (Sandbox Code Playgroud)
在矩阵上执行此操作要快得多:
dm <- matrix(1:25, ncol = 5); dm
dm[] <- sample(dm); dm
Run Code Online (Sandbox Code Playgroud)
编辑:这是错误的:"我非常确定首先在列上进行排列然后在行上进行排列应该会给你带来与置换整个向量相同的结果,然后重新变换为原始尺寸." <\ S>
"Simpson方法"会给出不同的结果,并且可能是所要求的(但如果要将其作为模拟工作的一部分来完成,那么使用矩阵测试平台会更快):
dm <- dm[ sample(nrow(dm)), sample( ncol(dm)) ]
Run Code Online (Sandbox Code Playgroud)