有人知道如何对数据框中的所有数据进行随机化吗?我的意思是,我想获得一个新的数据框,其中数据按行和列进行排列,以获得与第一个数据框中相同的数字的随机新数据框。
就像这样:
谢谢!
有人知道如何对数据框中的所有数据进行随机化吗?我的意思是,我想获得一个新的数据框,其中数据按行和列进行排列,以获得与第一个数据框中相同的数字的随机新数据框。
就像这样:
谢谢!
只需分别在行数和列数上使用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
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
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
使用矩阵来进行操作会更快:
dm <- matrix(1:25, ncol = 5); dm
dm[] <- sample(dm); dm
编辑:这是错误的:“我非常确定先在列上排列,然后在行上排列应该会给你与排列整个向量然后重新调整到原始维度相同的结果。” <\s>
“辛普森方法”将给出不同的结果,可能是所请求的(但如果这是作为模拟工作的一部分进行的话,使用矩阵测试平台会更快):
dm <- dm[ sample(nrow(dm)), sample( ncol(dm)) ]
[]
的威力。 - Jilber UrbinaNMF
包中的randomize
函数可能是您要寻找的。
从文档中可以看到:
randomize
函数可独立地对类似矩阵的对象中的每列进行排列,以生成可用于置换检验或 bootstrap 分析的随机数据。
sample(as.matrix(df),prod(dim(df)))
,但Gavin的方法有一个小优点,就是返回一个数据框。 - Carl WitthoftpermDF
将一行的所有元素保持在一起,尽管在不同的行和不同的顺序中。因此,这取决于您希望结果有多随机。 - Carl Witthoft