Rで重複のない組み合わせをexpand.grid()とsubset()で作る

まえだこうすけ
Published on 2016-09-13
Updated on 2017-02-05

Rのexpand.grid関数を使って、引数のベクトルの全組み合わせを作ることができます。例えば、こんな風に。

> 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関数も使って

> 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関数でクラスを取り除かなければいけません。

> 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

以上、RのTipsでした。


  1. この記事はメモ: 重複の無いネストループを作る – Momentumの補完になればと思い書きました。pipeRだとうまくいかなくて考えました。