【问题标题】:R find all possible unique combinationsR找到所有可能的唯一组合
【发布时间】:2018-03-29 19:18:26
【问题描述】:

我正在尝试在 R 中找到所有可能的独特组合。似乎已经提出了很多类似的问题,但我找不到相同的问题。

我的问题是从向量 x 中找到 m 个元素的组合,但 m 可能大于 x。例如,从 letters[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

如果之前有人问过同样的问题,再次道歉,但我没听懂。谢谢。

【问题讨论】:

  • a,a,a的组合是什么意思,那是什么组合?
  • 我的意思是结合向量源中的元素的可能性。
  • 那么当你没有将它与任何东西组合时,你如何称它为独特的组合呢?而是重复它?
  • 唯一性就是说,比如aab,aba,baa是一样的。
  • 我想你在multichoose combinations之后。看起来itertools 可以帮助您使用它的np_nc_ multiset 功能

标签: r combinations combn


【解决方案1】:

有一些专门为此构建的软件包。基本前提是我们需要具有重复长度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(上面的cmets中@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】:
    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" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多