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

  • 0
    いいね
  • 1
    コメント

    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だとうまくいかなくて考えました。