2013-02-26 64 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"