Rのexpand.grid関数を使って、引数のベクトルの全組み合わせを作ることができます。例えば、こんな風に作れます。
Rコンソール
> expand.grid(1:2,1:3)
Var1 Var2
1 1 1
2 2 1
3 1 2
4 2 2
5 1 3
6 2 3
この時、1 1、2 2というように値がかぶっている組み合わせ、1 2、2 1という重複している組み合わせを除きたいときがあります。そういうときはsubset関数も使って
Rコンソール
> combi <- expand.grid(1:2,1:3)
> subset(combi, Var1 < Var2)
Var1 Var2
3 1 2
5 1 3
6 2 3
とすると簡単にできます。この方法だとpipeRパッケージ、gtoolsパッケージを使わなくてよいです1。
A, B, Cなどの文字の組み合わせの時もほとんど同じなのですが、unclass関数でクラスを取り除かなければいけません。
Rコンソール
> combi <- expand.grid(c("A","B"), c("A","B","C"))
> combi
Var1 Var2
1 A A
2 B A
3 A B
4 B B
5 A C
6 B C
> subset(combi, Var1 < Var2)
[1] Var1 Var2
<0 rows> (or 0-length row.names)
Warning message:
In Ops.factor(Var1, Var2) : < not meaningful for factors
> subset(combi, unclass(Var1) < unclass(Var2))
Var1 Var2
3 A B
5 A C
6 B C
-
この記事はメモ: 重複の無いネストループを作る - Momentumの補完になればと思い書きました。pipeRだとうまくいかなくて考えました。 ↩