LoginSignup
5

More than 5 years have passed since last update.

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

Posted at

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5