2017-06-08 39 views
0

什么R命令生成长度为k的所有可能的有序组合?生成有序组合的函数

例如从这个载体:

a,b,c,d 

它要产生如该命令是保守的长度为3的所有组合,但只有那些者:

a,b,c 
a,b,d 
a,c,d 
b,c,d 

或者如果我有这样的载体

a,b,7,d,e 

我想对长度2做同样的事情:

因为它可以让你所有可能的组合,包括逆转的,如
ç
a,b 
a,7 
a,d 
a,e 
b,7 
b,d 
b,e 
7,d 
7,e 
d,e 

combn这里行不通,B
在简单的情况下,我可以尝试用expand.grid做到这一点,但是这两种方法将需要进一步处理。
也许有一个基本功能(或软件包)能够做我想做的甚至接受更复杂的条件。

PD:当我说“有序”时,我正在谈论出现在起始向量中的顺序。我不是指排版顺序,尽管在我的例子中它们是相同的。

+2

如果我做' combn(x,3,FUN = toString)'它给出预期的输出 - 其中'x < - letters [1:4]' – Sotos

+0

另外,这个https://stackoverflow.com/questions/21984830/creating-new-ids-two-way-from-two-vectors可能会对你的问题感兴趣。 – nadizan

回答

1

可以在基础R使用combn

vec <- c("a", "b", "c", "d") 
len <- 2 
combn(length(vec), len, function(x) vec[x]) 

# [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] "a" "a" "a" "b" "b" "c" 
#[2,] "b" "c" "d" "c" "d" "d" 

长度3作者:

combn(length(vec), 3, function(x) vec[x]) 

#  [,1] [,2] [,3] [,4] 
#[1,] "a" "a" "a" "b" 
#[2,] "b" "b" "c" "c" 
#[3,] "c" "d" "d" "d" 

OR为@Sotos在评论中指出:

combn(vec, len) 
+3

'combn(vec,2)'给出完全相同的输出 – Sotos