等高線図を描いたりするために、あるベクトルの要素と別のベクトルの要素の全パターンの組み合わせの一覧をつくりたいときがあります。ループでも作れますが、速度的にも見通し的にも生成関数を使った方が望ましいです。
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
)の省略もできますが、自動でつけられるVar1
やVar2
といった列名は後で混乱を招きがちだと思います。
記憶領域を各ベクトルの要素数の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