2013-05-10 65 views
3

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

类似这样的:

谢谢!

回答

6

这将是一个很大更快地做到这一点的一个矩阵:

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

编辑:这是错误的:“我敢肯定,第一个置换的列,然后在列应该 给出与排列整个矢量相同的结果,然后重新定形到原始尺寸。“ < \ S>

的“辛普森方法”将得到不同的结果,可能是被什么要求(但它会更快了矩阵测试平台,如果这是作为一个仿真努力的一部分来完成):

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

+1给你!在这些情况下,我总是忘记了'[]'的力量。 – 2013-05-10 17:07:18

+0

这是我在评论中的解决方案....教我不要作为回答发布:-((即使这是错误的答案 - 至少在加文的例子中,它显然不是一个完整的随机序列,正如我在那里指出的那样) – 2013-05-10 17:11:59

+0

我要离开它了,但是OP的想法并不完全清楚,我确实同意在列中进行排列,然后排列_en_bloc_会得到不同的结果 – 2013-05-10 17:15:24

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 
+0

+1。我有*精确*相同的答案排队去,甚至下到功能名称!你得在这里快点。 – 2013-05-10 17:04:46

+0

@ SimonO101现在你应该知道只是“等待它”。 (XKCD/1190)。与此同时,我只是想建议'sample(as.matrix(df),prod(dim(df)))',但是Gavin的方法具有返回数据帧的小优点。 – 2013-05-10 17:06:21

+1

等一下:Gavin的功能完全符合OP要求的功能,而我的偷偷摸摸的代码会以不同的方式加扰。请注意,'permDF'将所有行的元素放在一起,尽管行号不同,顺序也不同。所以这取决于你想要结果的“随机性”。 – 2013-05-10 17:10:58