R-forループ内のsample()は同一の順列を生成しますか?

permutation r
R-forループ内のsample()は同一の順列を生成しますか?

単純なforループを実行してベクトルのX個の順列を計算すると、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

そしてこれはうまくいきます! どこかにバグがあると思います! 私の入力はおそらく混乱しています。

ありがとう。

ありがとう。

  3  0


ベストアンサー

再現可能な例については、 options [1]`を定数セットおよび `labels`で組み込みまたは自己指定のデータフレームに置き換えてください。 (ところで、どちらも優れた変数名はベース関数ではありません。) `for`ループの内部を見るだけで、data.frameの最初の列を除くすべてをシャッフルします。 これは期待どおりに機能します。 `perm`の作成が完了したら、 print(names(perm)) `を入力すると表示されます。 次に、このデータフレームを以前の結果に「rbind」します。 `rbind`は、データフレームで動作していることを認識し、さまざまなデータフレームの列の順序を変更して、列名が並ぶようにします(一般的には、列の名前は、 1つであり、各列を適切に拡張する必要があります。)

問題は、あなたが考えているように「ベクトルの」ではなく、データフレームの列で置換をしていることです。

2


タイトルとURLをコピーしました