2013-05-10 67 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