順列を作ってみる
R には combn という組み合わせを作ってくれる関数がある。
> combn(1:3,2) [,1] [,2] [,3] [1,] 1 1 2 [2,] 2 3 3 > combn(letters[1:3],2) [,1] [,2] [,3] [1,] "a" "a" "b" [2,] "b" "c" "c"
けど順列を作ってくれる関数はなかったので、つくってみた。
permu <- function(x, n) { iter <- function(n, x, ls) { if(n == 0){ ls } else{ sapply(x, function(xs) iter(n-1, x[x!=xs], rbind(ls, xs))) } } r <- iter(n, x, NULL) dim(r) <- c(n, length(r) / n) r } > permu(1:3, 2) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 1 2 2 3 3 [2,] 2 3 1 3 1 2 > permu(letters[1:3], 2) [,1] [,2] [,3] [,4] [,5] [,6] [1,] "a" "a" "b" "b" "c" "c" [2,] "b" "c" "a" "c" "a" "b"
再帰を使って書いてあるから、あまり大きな数を指定できないな。
dim で形を整えてるとこも、ちと気に入らない。
再帰をループにして、apply系を使う方がいいのだろうけど、面倒なのでやめる。