2013-02-26 103 views
1

假设我有三个词:"blue","red""pink"来自递归列表的组合

我希望生成所有字母组合,其中我从“蓝色”中取出两个字母,然后将两个字母添加到“红色”之外,然后添加到两个字母之外的“粉红色”。

blrdpk

uerdin

等等

在R,I,通过分配每个字的字符到使用列表元素编码我三个字

words <- list(list("b","l","u","e"), list("r","e","d"), list("p","i","n","k")) 

我知道我可以使用lapplycombn(words[[i]],m=2)来获得2个lett的所有组合从每个单词中删除。

我有两个问题:

  1. 有combn的更高级版本(),它可以让你选择,并从不同的“水桶”用递归列表给出的串联组合?

  2. 如果没有combn()的高级版本,从三个单词中的每个单词连接每个单独的2个字母组合的最佳方式是什么?

  3. 如果我想从每个单词中获取不同数量的字母,是否有简单的方法? [添加自用户评论的其中一个答案]

+0

是否字母顺序重要吗? – 2013-02-26 01:20:56

+0

这些字母的顺序无关紧要。 – Alex 2013-02-26 01:22:13

+0

此外,我只是阅读,并回答问题2,我可能只需使用expand.grid() – Alex 2013-02-26 01:22:29

回答

4

可能有更高级的combn版本,但它已经很先进了。例如,您可以通过指定参数FUN将函数应用于每个组合。与expand.grid结合这减少和你喜欢的东西风

Reduce(paste0, expand.grid(lapply(words, function(x) { 
    combn(x, m=2, FUN=paste0, collapse="") 
}))) 

编辑: 如果从每个字中选择的字母数变化,这个数字可以作为一个属性然后使用该属性作为参数combnm参数。例如,选择第一个单词一个字母,从第二两个字母,以及三个字母从第三:

for(i in seq_along(words)) { 
    attr(words[[i]], "n") <- i 
} 

Reduce(paste0, expand.grid(lapply(words, function(x) { 
    combn(x, m=attr(x, "n"), FUN=paste0, collapse="")}))) 

另外,您可以使用mapply作为geektrader的答案。

+0

谢谢。如果我想从每个单词中获取不同数量的字母,是否有简单的方法? – Alex 2013-02-26 02:05:08

2

下面是解决方案从文字和字符数的清单列表将要从每个单词挑期望的结果

> words 
[1] "blue" "red" "pink" 
> wordsplit <- strsplit(words, split="") 
> wordsplit 
[[1]] 
[1] "b" "l" "u" "e" 

[[2]] 
[1] "r" "e" "d" 

[[3]] 
[1] "p" "i" "n" "k" 

> lengths <- c(2, 1, 3) 
> combos <- expand.grid(mapply(function(word, n) combn(word,m=n, FUN=paste0, collapse=""), wordsplit, lengths)) 
> head(combos) 
    Var1 Var2 Var3 
1 bl r pin 
2 bu r pin 
3 be r pin 
4 lu r pin 
5 le r pin 
6 ue r pin 

> do.call('paste0', combos) 
[1] "blrpin" "burpin" "berpin" "lurpin" "lerpin" "uerpin" "blepin" "buepin" "beepin" "luepin" "leepin" "ueepin" "bldpin" "budpin" "bedpin" "ludpin" 
[17] "ledpin" "uedpin" "blrpik" "burpik" "berpik" "lurpik" "lerpik" "uerpik" "blepik" "buepik" "beepik" "luepik" "leepik" "ueepik" "bldpik" "budpik" 
[33] "bedpik" "ludpik" "ledpik" "uedpik" "blrpnk" "burpnk" "berpnk" "lurpnk" "lerpnk" "uerpnk" "blepnk" "buepnk" "beepnk" "luepnk" "leepnk" "ueepnk" 
[49] "bldpnk" "budpnk" "bedpnk" "ludpnk" "ledpnk" "uedpnk" "blrink" "burink" "berink" "lurink" "lerink" "uerink" "bleink" "bueink" "beeink" "lueink" 
[65] "leeink" "ueeink" "bldink" "budink" "bedink" "ludink" "ledink" "uedink"