2011-10-26 13 views
3

単純なforループを実行してベクトルのX個の置換を計算すると、sample()関数は各繰り返しに対して同じ置換を返します。以下はforループ内のR - 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つの非常に異なるもの。詳細については私の答えを見てください(あなたのアップデートを見た前に書いてあります)。 –

答えて

2

は、単に内蔵または自己指定されたデータフレームに一定の設定とlabelsoptions[1]を交換してください。 (ちなみにどちらも素晴らしい関数名は基本関数ではありません)forループの内部を見てみると、data.frameの最初の列を除くすべての部分がシャッフルされます。これは期待通りに機能します。 permを完成させた後にprint(names(perm))を入れると、あなたが表示されます。あなたはrbindこのデータフレームを以前の結果にします。 rbindは、データフレームを処理していることを認識し、異なるデータフレームの列順序を整理し直して、列名が整列するようにします(一般的には、これを実行する必要があります。あなたはそれぞれの列を適切に拡張したいと思っています)。

問題は、あなたが思っているように、 "ベクトルの"ではなくデータフレームの列に対して順列をしていることです。

+0

私は 'rbind'がとても親切であることを知らなかった。それはなぜそれが非常に骨の折れるように 'data.frame'sで遅いのかを説明するのに役立つかもしれません。それに+1してください! –

関連する問題