4

離散変数が与えられた場合、それらの可能な順列pからランダムに選択したいと思います。k言い換えると、の変数とaの変数の場合、2つのランダム順列はとになり ます。{0,1}b{1,2,3}[0,2][1,3]

変数の数とそれらが取ることができる値が増えるにつれて、それを行うのは面倒になるので、最初にすべての可能な順列のテーブルを生成せずにこれらを生成したいと思います。欠点は、繰り返しを取得せずにこれを実行したいということです。私がここで見つけたコードは近づいています:

x <- sample.int (2, m*n, TRUE)-1L
dim(x) <- c(m,n) 

values > 2の場合、これを2進値の行列に減らすことができるので、2進変数のこの問題の解決に制限するだけで十分であることに気付きました。

4

4 に答える 4

1

ここに答えの試みがあります:

まず、kを生成したい組み合わせの数に設定します

k <- 6

# Store your "p discrete variables" as a list (in this case I've arbitrarily made 4)

variables <- list(a = 1:5, b = 3:12, c = 5:14, d = 7:20)

# Generate a matrix with combinations as rows and each column corresponding to a variable

combinations <- matrix( sapply(variables, sample, 1), 
                        ncol = length(variables), 
                        dimnames = list( NULL , names(variables))

                        )

# Compute combinations until you have generated k that are unique

while(nrow(combinations) < k){

comb.new <- sapply(variables, sample, 1)

combinations <- unique(rbind(combinations, comb.new))

}

rownames(combinations) <- NULL

あまりきれいではないことはわかっていますが、うまくいくようです!また、離散変数が同じ長さである必要がなく、各変数から一意の要素を選択するだけではなく、一意の組み合わせを計算するという利点もあります。

于 2013-01-10T17:07:21.103 に答える
1

これは必要なことを行います。全体としてではなく、変数ごとに順列を取ります。これは技術的には同じですが、速度が上がると思います。

a <- 1:100
b <- 1:100
c <- 1:100

yourdatamatrix <- cbind(a, b, c)

これでいくつかのデータが得られました。関数は次のとおりです。

PermutationFunction <- function (data, k) {

  # creating matrix: amount of variables * amount of permutations
  permutations <- matrix(1:(k * length(data[1,])), nrow=k) 
  row <- NULL

  # Output will have as many columns as there are variables.
  for (i in 1:length(data[1,])) {
   permutations[ ,i] <- sample(data[ , i], k, replace=FALSE)
  }
  permutations
}

PermutationFunction(yourdatamatrix, k = 10)

時間チェック (それぞれ 10000 の値を持つ 40 の変数、5000 を取る):

system.time(PermutationFunction(yourdatamatrix, 5000))

> system.time(PermutationFunction(yourdatamatrix, 5000))
   user  system elapsed 
   0.05    0.00    0.05 
于 2013-01-10T17:02:39.173 に答える
1

考えられるすべての順列を実行したくないと言ったことは知っていますが、実際にはそれほど面倒ではありません。expand.grid() を使用して、結果からサンプリングするだけです。例えば:

a <- c(0,1)
b <- c(1,2,3)
combinations <- expand.grid(a,b)

k <- 2
combinations[sample(nrow(combinations),k),]

これにより、

  Var1 Var2
2    1    1
5    0    3
于 2013-01-10T16:37:01.667 に答える
0

(あなたの用語に対する Kolassa の批判に同意します。) 問題が各セットで最大 16 のセットに制限されている場合は、各サンプルを単一の 4 バイト整数として保存できます (今後の R 3.0 より前の R のすべてのバージョンが行っているように)。 ) 最初の選択は最下位 2 バイトのビットとして、2 番目の選択は上位 2 バイトで表されます。「インデックス」が位置だった場所で、2^index[i] を合計します。コードが必要な場合は、まずコード化されたサンプル ケースを提供する必要があります。

于 2013-01-10T16:34:59.987 に答える