1

と の 3 つの単語がある"blue""red""pink"ます。

「青」から 2 文字を取り出し、「赤」から 2 文字を追加し、「ピンク」から 2 文字を追加する、すべての文字の組み合わせを生成したいと考えています。

blrdpk

uerdin

等...

R では、次を使用して各単語の文字をリスト要素に割り当てることにより、3 つの単語をコーディングしました。

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

lapplywithを使用しcombn(words[[i]],m=2)て、各単語から 2 文字のすべての組み合わせを取得できることを知っています。

2 つの質問があります。

  1. 再帰リストを使用して指定されたさまざまな「バケット」から組み合わせを選択して連結できる、combn() のより高度なバージョンはありますか?

  2. Combn() の高度なバージョンがない場合、3 つの単語のそれぞれから別々の 2 文字の組み合わせをそれぞれ連結する最良の方法は何ですか?

  3. 各単語から異なる数の文字が必要な場合、それを行う簡単な方法はありますか? [回答の1つにユーザーコメントから追加]

4

2 に答える 2

4

のより高度なバージョンがあるかもしれませんがcombn、すでにかなり高度です。たとえば、FUN引数を指定して各組み合わせに関数を適用できます。これを expand.grid および Reduce と組み合わせると、次のような結果になります。

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

編集: 各単語から選択される文字数が異なる場合、この数を単語リストの各要素の属性として追加し、その属性をmへの引数として使用できますcombn。たとえば、最初の単語に 1 文字、2 番目の単語から 2 文字、3 番目の単語から 3 文字を選択するには、次のようにします。

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="")})))

または、geektrader の回答のように mapply を使用することもできます。

于 2013-02-26T01:32:41.877 に答える
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"
于 2013-02-26T02:13:19.830 に答える