3

有人知道如何随机化数据框中的所有数据吗?我的意思是,我会得到一个新的数据框,其中数据按行和列排列,以获得一个与我在第一个中具有相同数字的偶然的新数据框。

像这样的东西:

谢谢!

4

3 回答 3

9

只需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

请注意,这会将行和列中的值保持在一起,但列和行的顺序不同。如果您希望数据集完全随机化,那么数据框并没有真正简单的方法。我会使用矩阵来做到这一点,但它需要更多的工作,正如@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

您可以使用与上面的索引略有不同的索引,以与矩阵相同的方式对数据框进行操作

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
于 2013-05-10T16:57:16.443 回答
6

在矩阵上执行此操作会快得多:

dm <- matrix(1:25, ncol = 5); dm
dm[] <- sample(dm); dm

编辑:这是错误的:“我很确定首先在列上排列,然后在行上排列应该给你与排列整个向量然后重塑到原始尺寸相同的结果。” <\s>

“辛普森方法”会给出不同的结果,并且可能是所要求的(但如果将其作为模拟工作的一部分来完成,则使用矩阵测试台会更快):

 dm <- dm[ sample(nrow(dm)), sample( ncol(dm)) ]
于 2013-05-10T17:04:17.340 回答
0

randomize包中的功能NMF可能是您正在寻找的。

从文档:

randomize 独立排列类似矩阵的对象的每一列中的条目,以生成可用于排列测试或引导分析的随机数据。

于 2019-11-16T19:27:34.387 回答