如何生成矢量的所有可能组合

时间:2015-06-23 06:38:46

标签: r vector

我有一个向量,比如A,B,C,D,E,我有兴趣生成所有可能的向量元素组合。所需的输出如下。

B-AC-AD-AE-AC-BD-BE-BD-C E-CE-D

2 个答案:

答案 0 :(得分:4)

尝试

combn(v1, 2, FUN=function(x) paste(rev(x), collapse="-"))
#[1] "B-A" "C-A" "D-A" "E-A" "C-B" "D-B" "E-B" "D-C" "E-C" "E-D"

如果您想要默认顺序

combn(v1, 2, FUN=paste, collapse="-")
#[1] "A-B" "A-C" "A-D" "A-E" "B-C" "B-D" "B-E" "C-D" "C-E" "D-E"

更新

要获得更快的选项,您可以使用combnPrim中的grBase。查看here

library(grBase) 
apply(combnPrim(v1,2), 2, FUN=paste, collapse='-')
#[1] "A-B" "A-C" "B-C" "A-D" "B-D" "C-D" "A-E" "B-E" "C-E" "D-E"

数据

v1 <- LETTERS[1:5]

答案 1 :(得分:4)

combn是经典的方式。但它通常很慢(它完全用R写)。这是另一个我相信更快的选择:

grep('(.)-\\1',unique(as.vector(outer(v1,v1,FUN=paste,sep='-'))),
     value=TRUE,invert=TRUE)

如果您有多个字符,则正则表达式变为:

  (.*)-\\1
  1. 我使用了矢量化outer来创建所有组合
  2. 然后我使用一些正则表达式删除了重复的字符。
  3. 这给出了所有组合及其相反顺序:

    编辑一些benchamrks:

    v1 <- LETTERS
    fun_agstudy <- function()
    grep('(.)-\\1',unique(as.vector(outer(v1,v1,FUN=paste,sep='-'))),
         value=TRUE,invert=TRUE)
    fun_akrun <- function()
    combn(v1, 2, FUN=function(x) paste(rev(x), collapse="-"))
    library(microbenchmark)
    microbenchmark(fun_agstudy(),fun_akrun())
    

    enter image description here

              expr      min       lq     mean   median       uq      max neval
    1 fun_agstudy()  692.149  707.509 1082.153  774.259  956.114 25818.46   100
    2   fun_akrun() 6597.217 6681.982 8076.223 6765.040 9020.306 36364.15   100
    
    使用bioclite

    edit2:

    outer还要快一点

    summary(microbenchmark(fun_agstudy(),fun_akrun(),fun_combnPrim()))
                 expr      min        lq      mean    median       uq       max neval
    1   fun_agstudy()  700.114  735.3845  801.3568  786.2055  810.288  2572.896   100
    2     fun_akrun() 6830.082 6929.2590 9030.9779 7040.5720 7498.717 62051.764   100
    3 fun_combnPrim() 1928.534 1985.9925 2407.1335 2035.8655 2176.191 28514.237   100