私は効率的にRのベクトルの逸脱(逆に特定の順列)を作成する方法を検討しています 私が見た限り、基本機能はありませんそれはあまりにもここにはあまりないです。効率的にベクトルの逸脱を作成するR
明らかな始まりは、ベクトルの順列を作成するsample
です。しかし、私は固定点を持たないためにこの順列が必要なので、ベクトルの混乱になります。このトピックの説明は、this Cross Validated postを参照してください。
これが私の最初のアプローチです:ベクトルx
とxp
と呼ばれるx
の与えられた順列との間には一定のポイントがあるかどう
derangr <- function(x){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == 0) break
}
return(xp)
}
のでwhile
ループ内で、私はチェックしています。存在しない場合は、ループを解除してベクターを返します。
結果が示すように、それが正常に動作します:
> derangr(1:10)
[1] 4 5 6 10 7 2 1 9 3 8
> derangr(LETTERS)
[1] "C" "O" "L" "J" "A" "I" "Y" "M" "G" "T" "S" "R" "Z" "V" "N" "K" "D" "Q" "B" "H" "F" "E" "X" "W" "U" "P"
それを行うのは良い方法がありますのであれば、私は潜在的にいくつかの種類のベクトル化によってwhile
を代入すると、思ったんだけど。私はまた、スケーラビリティに注目したいと思っています。ここで
microbenchmark
です:
library(microbenchmark)
> microbenchmark(derangr(1:10),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(1:10) 8.359 15.492 40.1807 28.3195 49.4435 6866.453 10000
> microbenchmark(derangr(LETTERS),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(LETTERS) 24.385 31.123 34.75819 32.4475 34.3225 10200.17 10000
同じ質問が定点n
の与えられた数の順列を生成する、逆に適用されます。
arrangr <- function(x,n){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == n) break
}
return(xp)
}
'rep(LETTERS、2)'のようにいくつかの値がベクトル内に複数存在しますか?もしそうなら、最初の "A"が2番目の "A"などと交換されるかどうかは重要ですか? – loki
私は一般的な解決策を探しているので、良い点を挙げています。私の関数は一意の値を仮定します。もしあなたが繰り返し値を持っていれば、前の位置に要素(または逆に 'n')要素が残っていない限り、拳" A "が2番目の要素によって交換されるかどうかは関係ありません。 – Val