【问题标题】:Given a vector, return a list of all combinations up to size n给定一个向量,返回大小为 n 的所有组合的列表
【发布时间】:2012-11-06 20:08:07
【问题描述】:

我正在尝试在 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),但我似乎无法将结果合并到一个列表中。有什么建议吗?

【问题讨论】:

    标签: r combinations


    【解决方案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"
    

    【讨论】:

    • +1,我在那个轨道上。 simplify=F 是我想不通的部分。干得好。
    • 是的,simplifyrecursive 有一些杂耍。最后一个花了我好几秒钟才记住..
    • +1 和更紧凑的版本:do.call(c, lapply(1:n, combn, x=dat, simplify=FALSE)).
    【解决方案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])
    

    【讨论】:

      【解决方案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" 
      

      【讨论】:

      • 关闭。我真的很想制作一个每个组合一个条目的列表,所以我可以遍历列表。
      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多