簡體   English   中英

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

[英]How can I generate all the possible combinations of a vector

我有一個向量,比如A,B,C,D,E ,我有興趣生成所有可能的向量元素組合。 所需的輸出如下。

BACADAEACBDBEBDCECED

嘗試

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"

更新

要獲得更快的選項,您可以使用combnPrimgrBase 點擊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是經典的方式。 但它通常很慢(它完全用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

edit2使用bioclite:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM