[R]複数の文字列による重複順列を得る
重複順列とは、複数のものから同じものを繰り返しとることを許してとって並べた順列のこと。高校で学ぶ数学で重複順列は「n個からr個とった重複順列」という。
以下では、与えれたn個の文字列からn個とった重複順列を求めている。例として"A"と"B"の2つの文字列であれば、"AA", "AB", "BA", "BB"の4個の文字列を作成するということ。"A", "B", "C"の3つであれば、"AAA", "AAB", "AAC", "ABA", …, "CCB", "CCC"の27個となる。
gtoolsパッケージのpermutations関数を使う。repeats.allowオプション(デフォルト:FALSE)がFALSEの場合は、繰り返し取ることが認められなくなり、順番を考慮した組合せになってしまうため、TRUEとすること。戻り値は配列のため、これをapply関数を利用してpaste0関数で連結すれば、ベクトルでまとめて得られる。
> library(gtools)
> ss <- c("A", "B")
> permutations(2, 2, ss)
[,1] [,2]
[1,] "A" "B"
[2,] "B" "A"
> ar <- permutations(2, 2, ss)
> apply(ar, 1, function(s) {return(paste0(s, collapse = ""))})
[1] "AB" "BA"
> ss <- c("A", "B", "C")
> permutations(3, 3, ss)
[,1] [,2] [,3]
[1,] "A" "B" "C"
[2,] "A" "C" "B"
[3,] "B" "A" "C"
[4,] "B" "C" "A"
[5,] "C" "A" "B"
[6,] "C" "B" "A"
> permutations(3, 3, ss, repeats.allow = TRUE)
[,1] [,2] [,3]
[1,] "A" "A" "A"
[2,] "A" "A" "B"
[3,] "A" "A" "C"
[4,] "A" "B" "A"
[5,] "A" "B" "B"
[6,] "A" "B" "C"
[7,] "A" "C" "A"
[8,] "A" "C" "B"
[9,] "A" "C" "C"
[10,] "B" "A" "A"
[11,] "B" "A" "B"
[12,] "B" "A" "C"
[13,] "B" "B" "A"
[14,] "B" "B" "B"
[15,] "B" "B" "C"
[16,] "B" "C" "A"
[17,] "B" "C" "B"
[18,] "B" "C" "C"
[19,] "C" "A" "A"
[20,] "C" "A" "B"
[21,] "C" "A" "C"
[22,] "C" "B" "A"
[23,] "C" "B" "B"
[24,] "C" "B" "C"
[25,] "C" "C" "A"
[26,] "C" "C" "B"
[27,] "C" "C" "C"
> ar <- permutations(3, 3, ss, repeats.allow = TRUE)
> apply(ar, 1, function(s) {return(paste0(s, collapse = ""))})
[1] "AAA" "AAB" "AAC" "ABA" "ABB" "ABC" "ACA" "ACB" "ACC" "BAA"
[11] "BAB" "BAC" "BBA" "BBB" "BBC" "BCA" "BCB" "BCC" "CAA" "CAB"
[21] "CAC" "CBA" "CBB" "CBC" "CCA" "CCB" "CCC"
