3

ベクトルと最大サイズ n を指定すると、そのベクトルからサイズ n までの要素のすべての組み合わせを返す関数を R で作成しようとしています。

例えば:

multi_combn(LETTERS[1:3], 2)

次の結果が得られます。

[[1]]
[1] "A"

[[2]]
[1] "B"

[[3]]
[1] "C"

[[4]]
[1] "A" "B"

[[5]]
[1] "A" "C"

[[6]]
[1] "B" "C"

combnn までのサイズごとに実行する洗練されていない方法を見つけましたが、結果を単一のリストに結合することはできないようです。助言がありますか?

4

3 に答える 3

11

これを試して:

multi_combn <- function(dat, n) {
    unlist(lapply(1:n, function(x) combn(dat, x, simplify=F)), recursive=F)
}

返す

> multi_combn(LETTERS[1:3], 2)
[[1]]
[1] "A"

[[2]]
[1] "B"

[[3]]
[1] "C"

[[4]]
[1] "A" "B"

[[5]]
[1] "A" "C"

[[6]]
[1] "B" "C"
于 2012-11-06T20:19:14.223 に答える
5

楽しみのために、まったく異なるアプローチをいくつか紹介します。

代替案 1:

multi_combn <- function(X) {
    ii <- do.call(expand.grid, 
                  replicate(length(X), c(FALSE, TRUE), simplify=FALSE))[-1,]
    apply(ii, 1, function(i) X[i])
}
multi_combn(LETTERS[1:3])

代替案 2: (通常、難読化されたコードは好きではありませんが、この関数は例外です。)

multi_combn <- function(X) {
    sapply(seq_len(2^(length(X)) - 1), 
           FUN = function(n) {
               X[as.logical(rawToBits(as.raw(n)))]
           })
}    
multi_combn(LETTERS[1:3])
于 2012-11-06T20:59:49.047 に答える
2

目的の出力と完全に同じ形式ではありませんが、おそらく十分に近いですか?

multi_combn <- function(dat, n) {
    lapply(seq_len(n), function(x) t(combn(dat, x))) 
}

> dat <- LETTERS[1:3]
> multi_combn(dat,3)
[[1]]
     [,1]
[1,] "A" 
[2,] "B" 
[3,] "C" 

[[2]]
     [,1] [,2]
[1,] "A"  "B" 
[2,] "A"  "C" 
[3,] "B"  "C" 

[[3]]
     [,1] [,2] [,3]
[1,] "A"  "B"  "C" 
于 2012-11-06T20:13:15.477 に答える