3

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

例如:

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"

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

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 回答