代码之家  ›  专栏  ›  技术社区  ›  Jian

R查找所有可能的唯一组合

  •  5
  • Jian  · 技术社区  · 6 年前

    我正在努力寻找R中所有可能的独特组合。似乎有很多类似的问题被问到,但我找不到相同的问题。

    我的问题是从向量x中找出m个元素的组合,但m可能大于x。例如,从字母[1:2]中选取3个元素,希望可以返回:

    combn(letters[1:2],3)
           [,1]  [,2]  [,3]  [,4] 
    [1,]   "a"   "a"   "a"    "b"
    [2,]   "a"   "a"   "b"    "b"
    [3,]   "a"   "b"   "b"    "b"
    

    而是combn函数中的错误n<m、 还有类似的功能,包括gtools:置换、扩展。网格

    如果之前有人问了同样的问题,请再次道歉,但我没听清楚。谢谢

    3 回复  |  直到 6 年前
        1
  •  7
  •   Joseph Wood    6 年前

    有几个专门为此构建的包。基本前提是我们需要长度重复的组合 m 哪里 m级 可能大于输入向量。我们从经典开始 gtools :

    library(gtools)
    combinations(2, 3, letters[1:2], repeats.allowed = TRUE)
        [,1] [,2] [,3]
    [1,] "a"  "a"  "a" 
    [2,] "a"  "a"  "b" 
    [3,] "a"  "b"  "b" 
    [4,] "b"  "b"  "b"
    

    然后就有了 arrangements 它是 iterpc (上述评论中由@Gregor链接的包):

    library(arrangements)
    arrangements::combinations(2, 3, letters[1:2], replace = TRUE)
         [,1] [,2] [,3]
    [1,] "a"  "a"  "a" 
    [2,] "a"  "a"  "b" 
    [3,] "a"  "b"  "b" 
    [4,] "b"  "b"  "b"
    

    最后还有 RcppAlgos ,作者:

    library(RcppAlgos)
    comboGeneral(letters[1:2], 3, TRUE)
         [,1] [,2] [,3]
    [1,] "a"  "a"  "a" 
    [2,] "a"  "a"  "b" 
    [3,] "a"  "b"  "b" 
    [4,] "b"  "b"  "b"
    

    combn 是一个很棒的功能,作为基本软件包之一随附 R 然而,它的缺点之一是不允许重复(这是这里需要的)。我写了一篇非常全面的概述,内容与下面的问题一模一样: A Walk Through a Slice of Combinatorics in R

        2
  •  1
  •   Onyambu    6 年前
    combn1=function(x,m){
      n=ifelse(length(x)==1,ifelse(is.numeric(x),x,1),length(x))
      if(n>=m) return(combn(x,m))
      a=do.call(expand.grid, rep(list(x),m))
      b=t(unique(t(apply(a,1,sort))))
      `dimnames<-`(b,NULL)
    }
    
    combn1(letters[1],3)
         [,1]
    [1,] "a" 
    [2,] "a" 
    [3,] "a" 
    > combn1(letters[1:2],3)
         [,1] [,2] [,3] [,4]
    [1,] "a"  "a"  "a"  "b" 
    [2,] "a"  "a"  "b"  "b" 
    [3,] "a"  "b"  "b"  "b" 
    > combn1(letters[1:3],3)
         [,1]
    [1,] "a" 
    [2,] "b" 
    [3,] "c" 
    
        3
  •  0
  •   patL grad student    2 年前
    v1 = letters[1:4]
    
    do.call("c",lapply(seq_along(v1),function(i) utils::combn(v1,i,FUN=list)))
    
    推荐文章