複数のベクトル間で、特定のベクトルだけに含まれる要素を抽出する方法

R初心者なので、こんな初歩的なことを投稿するのも恥ずかしいことだけど、いつか同じ初心者の誰かの役に立つことを信じて、まとめておこうと思う。

準備

# ベクタaからcに、種名を入れていく
a <- c("セイヨウタンポポ", "カタバミ", "コハコベ", "ノミノツヅリ")
b <- c("フデリンドウ", "コハコベ", "セイヨウタンポポ")
c <- c("カタバミ", "ミチタネツケバナ", "コハコベ")

例えば、こんなフロラリストをまとめたベクタがあったとします1

これは、既存のデータを加工するなりして作成できると思います。

全ベクトルに共通する要素を抽出する

  • intersectで、2つのベクトルで重複していない要素を抽出する。それを複数回繰り返す。
intersect(intersect(a, b), c)

ちなみにこの結果は、

[1] "コハコベ"

うん、正しく出力されましたね。

a,bに含まれていて、cにはない要素を抽出する

  • これは一瞬勘違いをしたのですが、正確には

    「a or bに含まれている」and「cには含まれていない」

    ということを、多くの場合求めたいということだと思う。

  • こうした場合、unionを使ってaとbの和集合を作り、そこから他のベクトルでintersectで重複要素を外していくのがよい。

    setdiff(union(a, b), c)
    

この結果は

[1] "セイヨウタンポポ" "ノミノツヅリ"     "フデリンドウ"  

a, b だけでしかみられないノミノツヅリ、フデリンドウもちゃんと出力されていますね。

実際は、もっと沢山のデータセットを扱うものでしょうが、解析のとっかかりにはいい手法だなと、私自身は考えています。

  1. あくまで、例示のためのダミーデータです。