R

トップページ
Google
WWWを検索
サイト内を検索

等高線図を描いたりするために、あるベクトルの要素と別のベクトルの要素の全パターンの組み合わせの一覧をつくりたいときがあります。ループでも作れますが、速度的にも見通し的にも生成関数を使った方が望ましいです。

1 expand.grid

以下の例ではc(1,2,3)c(4,5,6)の全パターンの組み合わせのデータフレームをつくります。

expand.grid(x=1:3, y=4:6)
  x y
1 1 4
2 2 4
3 3 4
4 1 5
5 2 5
6 3 5
7 1 6
8 2 6
9 3 6

3次元以上の組み合わせも作れます。以下の例ではc(1,2,3)c(4,5,6)c(7,8,9)の全パターンの組み合わせをつくります。

expand.grid(x=1:3, y=4:6, z=7:9)
   x y z
1  1 4 7
2  2 4 7
3  3 4 7
4  1 5 7
5  2 5 7
6  3 5 7
7  1 6 7
8  2 6 7
9  3 6 7
10 1 4 8
11 2 4 8
12 3 4 8
13 1 5 8
14 2 5 8
15 3 5 8
16 1 6 8
17 2 6 8
18 3 6 8
19 1 4 9
20 2 4 9
21 3 4 9
22 1 5 9
23 2 5 9
24 3 5 9
25 1 6 9
26 2 6 9
27 3 6 9

引数の名前(上の例ではx,y,z)の省略もできますが、自動でつけられるVar1Var2といった列名は後で混乱を招きがちだと思います。

記憶領域を各ベクトルの要素数の3乗分占有するので、これで最尤法を解くような事はできません。

2 outer

outer関数で全組み合わせによる掛け算の結果の行列、つまり外積がつくれます。

outer(1:3, 4:6)
     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    8   10   12
[3,]   12   15   18

matrix(with(expand.grid(x=1:3, y=4:6), x*y), 3, 3)と同様の結果になるわけですが、outerを使う方が簡潔な記述かつ高速になります。 %o%outerのラッパーになる二項演算子です。

outerの乗算は任意の関数で置き換えることができ、以下では加算に変えています。

outer(1:3, 4:6, "+")
     [,1] [,2] [,3]
[1,]    5    6    7
[2,]    6    7    8
[3,]    7    8    9