给定一个向量,返回大小为n的所有组合的列表

时间:2012-11-06 20:08:07

标签: r combinations

我正在尝试在R中编写一个函数,给定一个向量和最大大小为n,将返回该向量中元素的所有组合,最大为n。

E.g:

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"

我已经找到了为每个大小到n运行combn的不雅方式,但我似乎无法将结果合并到一个列表中。有什么建议吗?

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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])

答案 2 :(得分: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"