2011-10-26 25 views
3

當我運行一個簡單的for循環來計算向量的X個排列時,sample()函數爲每次迭代返回相同的排列。R - for循環中的sample()生成相同的排列?

下面是我的代碼:

options <- commandArgs(trailingOnly=T) 
labels <- read.table(options[2], header=F) 
holder <- c() 

for (i in 1:options[1]){ 

    perm <- sample(labels[,2:ncol(labels)], replace=F) 
    perm <- cbind(as.character(labels[1]), perm) 
    holder <- rbind(holder, perm) 

} 

write.table(holder, file=options[3], row.names=F, col.names=F, quote=F, sep='\t') 

是否有一個原因,爲什麼會這樣?有沒有另一種簡單的方法來生成1000個矢量的排列?

* 評論後添加 - 一個可複製的例子 *

vec <- 1:10 
holder <-c() 
for (i in 1:5){ 
    perm <- sample(vec, replace=F) 
    holder <- rbind(holder, perm) 
} 

> holder 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
perm 3 2 1 10 9 6 7 4 5  8 
perm 5 8 2 3 4 10 9 1 6  7 
perm 10 7 3 1 4 2 5 8 9  6 
perm 9 5 2 8 3 1 6 10 7  4 
perm 3 7 5 6 8 2 1 9 10  4 

而且這工作得很好!我想我有一個地方的錯誤!我的意見可能是一團糟。

謝謝, D.

謝謝, D.

+4

我不知道如何複製你的結果。小心給我一隻手? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

在你可重現的例子中,你正在抽取一個矢量('vec');在原文中,你正在抽樣一個數據框('read.table'的結果)。兩件完全不同的事情。查看我的答案(在我看到您的更新之前編寫)以獲取更多詳細信息。 –

回答

2

對於重現的實例中,只是用一個恆定的設定和labels到內置的或自指定的數據幀替換options[1]。 (順便說一句,既不是很大的變量名稱也是基本函數。)只要看看for循環的內部部分,就可以對除data.frame的第一列以外的所有數據進行隨機混合。這符合你的期望。在完成製作perm之後,你會看到print(names(perm))。然後你將這個數據框rbind轉換爲以前的結果。 rbind,認識到它正在處理數據幀,有助於重新調整不同數據框的列順序,以便列名排成一列(這通常是您希望它執行的操作;列的名稱定義了它的哪一個是,你會想適當地擴展每一列。)

問題是,你正在做一個數據框的列的排列,而不是像你認爲的那樣的「矢量」的列。

+0

我不知道'rbind'是如此'善良'。這可能有助於解釋爲什麼它在data.frame上非常緩慢。有一個+1! –