【问题标题】:How can I generate all the possible combinations of a vector如何生成向量的所有可能组合
【发布时间】:2015-06-23 06:38:45
【问题描述】:

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

B-A,C-A,D-A,E-A,C-B,D-B,E-B,D-C,E-C,E-D

【问题讨论】:

    标签: r vector


    【解决方案1】:

    试试

    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"
    

    更新

    要获得更快的选项,您可以使用grBase 中的combnPrim。检查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]
    

    【讨论】:

    • 随便combn(v1, 2, FUN=paste, collapse="-")
    • 如果我想要两者,例如,A-B,B-A。
    • @AwaitedOne 为此,您可以使用 expand.gridouter
    • @akrun 你的意思是像@agstudy 建议的grep('(.*)-\\1', unique(as.vector(outer(unique_conds, unique_conds, FUN = paste, sep = '-' ))), value = TRUE, invert = TRUE)。但它没有为v1 &lt;- c("A", "Aa", "B") 提供适当的输出,因为缺少"A-Aa" ,可能是正则表达式的问题。
    • @AwaitedOne 不确定。可能你需要发布一个新问题
    【解决方案2】:

    combn 是经典的方法。但它通常很慢(它完全是用 R 编写的)。这是我认为更快的另一种选择:

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

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

      (.*)-\\1
    
    1. 我使用了矢量化的outer 来创建所有组合
    2. 然后我使用一些正则表达式删除了重复的字符。

    这给出了所有组合及其相反的顺序:

    编辑一些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())
    

              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 编辑 2:

    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
    

    【讨论】:

    • 也许你可以尝试添加一些基准来支持你的断言。
    • 我认为它给出了所有组合 A-B 及其相反的顺序,即 B-A
    • 试试combnPrim。另外,我不知道您是否使用小向量进行基准测试。
    • @akrun outermapply 通常非常有效。甚至,如果在这里我应该调整正则表达式以按照 OP 中的要求删除重复的对。
    • @agstudy,我试过v1 &lt;- c("C","Tu"),结果是"Tu-C" "C-Tu" "Tu-Tu",怎么样??
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多