0

他のブロックの一意の要素ごとにランダムな順列が取得されるように、別の変数ブロックによって (sample() 関数を使用して) ベクトルのランダムな順列を作成しています。ただし、ブロック内の一意の要素が大きくなると、数順列のサイズが変化します。unlist() 関数がスペースホルダーを作成しているかどうか、またはなぜこれが起こっているのかはわかりません。以下のコード例を参照してください。block1 を使用した順列の次元は元の変数の長さですが、block2 の方が長くなります。コードがこれを行っている理由に私は唖然とします。何かご意見は?

x <- sample(1:3, 250, replace = TRUE)
block1 <- sample(1:20, 250, replace = TRUE)
block2 <- sample(1:100, 250, replace = TRUE)

block_permutation = function(x, block) unlist(as.vector(sapply(unique(block), function(j) sample(x[block==j]))))

perm1<- sapply(1:2, function(i) block_permutation(x, block1))
perm2<- sapply(1:2, function(i) block_permutation(x, block2))

dim(perm1)
dim(perm2)
4

2 に答える 2

0

私があなたのコードを正しく理解していれば、あなたの問題はそれがsample(5)実際には を意味sample.int(5)し、 と同じであるということsample(1:5, 5)です。したがって、x[block == j]結果が 1 つの数値になる場合は、1 つの数列からサンプリングしていません。

Aaron が指摘しているように、これは に文書化されて?sampleおり、次の代わりにこの関数を使用する必要がありsampleますblock_permutation

resample <- function(x, ...) x[sample.int(length(x), ...)]

また、as.vectorは不要です。

于 2013-07-09T20:41:30.373 に答える