给定一个向量,返回所有组合的列表多达大小n(Given a vector, return a lis

2019-07-03 14:56发布

我试着写在R A函数,给定一个向量,最大规模为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,但我似乎无法将结果合并成一个单独的列表。 有什么建议?

Answer 1:

试试这个:

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"


Answer 2:

只是为了好玩,这里有几个完全不同的方法:

选择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])


Answer 3:

不完全是相同的格式,你想要的输出,但也许足够接近?

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" 


文章来源: Given a vector, return a list of all combinations up to size n