[英]How can I generate all the possible combinations of a vector
我有一個向量,比如A,B,C,D,E
,我有興趣生成所有可能的向量元素組合。 所需的輸出如下。
BA
, CA
, DA
, EA
, CB
, DB
, EB
, DC
, EC
, ED
嘗試
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]
combn
是經典的方式。 但它通常很慢(它完全用R寫)。 這里我認為另一種選擇更快:
grep('(.)-\\1',unique(as.vector(outer(v1,v1,FUN=paste,sep='-'))),
value=TRUE,invert=TRUE)
如果您有多個字符,正則表達式將變為:
(.*)-\\1
outer
來創建所有組合 這給出了所有組合及其相反的順序:
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
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.