p_tan's blog

勉強日記です。ツッコミ大歓迎

直積集合 (追記:expand.grid)

2012/09/20 追記
R Tips 第2版を購入して読んでいたら、expand.gridなる関数があるじゃないですか・・・。
The R Tips―データ解析環境Rの基本技・グラフィックス活用集

ということで、下でやっていることはexpand.grid関数でできます。
ああ、もっと検索力が欲しい。




Rで直積集合を求める関数が見つからなかったので自作。
任意個の名前付きベクトルを受け取って、直積集合のデータフレームを返す。

direct.product <- function(...) {
  xs <- list(...)
  n <- length(xs)
  ns <- cumprod(sapply(xs, length))
  lapply(1:n, function(i) {
    times <- if(i > 1) ns[i-1] else 1
    each <- ns[n] / ns[i]
    xs[[i]] <<- rep(xs[[i]], times=times, each=each)
  })
  data.frame(xs)
}

使用例

> direct.product(x=1:3, y=4:5, z=6:8)
   x y z
1  1 4 6
2  1 4 7
3  1 4 8
4  1 5 6
5  1 5 7
6  1 5 8
7  2 4 6
8  2 4 7
9  2 4 8
10 2 5 6
11 2 5 7
12 2 5 8
13 3 4 6
14 3 4 7
15 3 4 8
16 3 5 6
17 3 5 7
18 3 5 8