按行和列排列数据框

时间:2013-05-10 16:54:07

标签: r permutation

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

这样的事情:

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

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

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

编辑:这是错误的:“我非常确定首先在列上进行排列然后在行上进行排列应该会给你带来与置换整个向量相同的结果,然后重新整形到原始尺寸。” &LT; \ S取代;

“Simpson方法”会得到不同的结果,可能是所要求的(但如果要将其作为模拟工作的一部分,那么使用矩阵测试平台会更快):

 dm <- dm[ sample(nrow(dm)), sample( ncol(dm)) ]

答案 2 :(得分:0)

您可能正在寻找randomize包中的

NMF函数。

来自文档:

  

randomize独立地排列a的每一列中的条目   类似于矩阵的对象,以生成可用于   排列测试或自举分析。