DS講座 tidyverse tidyverse講座

【R前処理講座14】{dplyr} filter:行の抽出【tidyverse】

こんにちは,shun(@datasciencemore)です!!
前回,dplyrの最重要関数であるfilter, select, mutateについて,学習しました.
次の段階はこれらをより深く学んでいきましょう.
今回は,filterを重点的にやっていきましょう.
まず,filterの復習です.
filterは,条件を指定してあげて,その条件を満たした行を抽出するときに使用するんでしたね.


この一見シンプルに見えるfilterですが,実はいろいろな機能があるので,一つ一つ見ていきましょう.

0.filterの内部処理

filterは,実は

① 条件を判定し,行ごとに論理値ベクトル(TRUE,FALSE)を作成する.
② ①の論理値ベクトルをデータフレームに記録する.
③ ②でTRUEであった行のみを抽出する.

ということを順番に内部でしています.

???

大丈夫,これも例をみればイメージがつかめるよ!

例えば,次のようなデータフレーム(dfとする.)を考えます.

ちなみにこのデータフレームは,とある会社の従業員の性別(gender)と身長(height)を表すデータです.

 

このデータフレームからgender = Fの行を抽出してみましょう.

 

はい,無事に指定した条件で抽出できましたね.
これは,内部的に以下のような流れで処理されています.

① gender == "F"を判定し,行ごとに論理値ベクトル(TRUE,FALSE)を作成する.
② ①の論理値ベクトルをdfに記録する.
③ ②でTRUEとなった行のみを抽出する.

要するに,

条件を判定して,論理値ベクトルを作成し,その論理値ベクトルをもとに抽出される行が決定される!!

ということです.

この仕組みによって,実はfilterの()内に直接,論理値ベクトルを入れても動作します.

 

上の結果と全く同じ結果になりました.

gender == "F"の判定結果が
c(FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)なので当然ですね.

この考え方はめっちゃ大事なので,イメージできるようになってください!!
それでは,次章以降は,この考え方を応用してより複雑な条件を考えてみましょう.
以降のデータはおなじみのdiamonodsを使用します.

 

1.数値フィルタ

まずは数値フィルタでいろいろなフィルタを試してみましょう.

数値フィルタとは,データ型がintかdblの列について,条件を指定することとします.

 

さりげなくbetweenを使用しましたが,これは,以下と同じことです.

betweenを使うと簡潔に書けるので,慣れてくださいね.

※ただし,指定した両端の値(今回の例だと0.23と0.27)も含むので,注意してください.

2.文字列フィルタ

次に文字列フィルタです.

文字列フィルタとは,データ型がchrかfactorの列について,条件を指定することとします.

ベクトル1 %in% ベクトル2でベクトル1の各要素に対して,ベクトル2が含まれるか否かを判定した論理値ベクトルを返します.
イメージは以下のとおり

3.NAフィルタ

データフレームに常に値が入っているとは限りません.
欠損値としてNAがある場合も多々あります.
そういうときのフィルタリングについて紹介します.

NAがないから1行も抽出されませんでしたね笑
該当する行がない場合は,こんな感じで出力されます.
初めて見るとビビりますが,問題ないですよ笑
念のため,NAがあるデータフレームで確かめてみましょう.

はい,しっかりとNAだけ抽出できました!

4.複合フィルタ

複合フィルタってのは,そんなに難しいことじゃありません.
今までの1~3では,指定した条件から作成された論理値ベクトルでTRUEの行が抽出されることを学びました.
実は,この指定した条件から作成された論理値ベクトルを論理演算(AND,OR,XOR,NOT)で組み合わせることができます.
これも言葉だけだと何言ってるのかよくわからないので,例によって図で説明しますね.

データフレームにfilterを適用すると論理値ベクトルが得られるのでした.
ここで得られる論理値ベクトルは指定した条件ごとに違いますよね.
例えばdiamondsで説明すると

条件1:depth列が62以上の行をフィルタリング
条件2:color列がHの行をフィルタリング

とすると,条件1と条件2で,それぞれに対応する論理値ベクトルが得られます.
これらの論理値ベクトルに論理演算を適用することができます.
例えば,depth列が62以上でcolor列がHの行をフィルタリングしたいなぁと思ったら
条件1で得られた論理値ベクトルと条件2で得られた論理値ベクトルにAND演算をすればOKです.
もちろんAND演算だけではなく,残りのOR,XOR,NOTも使用できます.
以下,具体例を挙げます.

AND

OR

XOR

NOT

複合条件を使うことでいろいろなパターンのデータフレームを抽出することができます.

まとめ

今回はfilterの使い方についてまとめました.
filterは内部的に論理値ベクトルによって抽出する行を選択しています.
また,filterの具体例についてまとめると,以下のようになります.

  1. 数値フィルタ
  2. 文字列フィルタ
  3. NAフィルタ
  4. 複合フィルタ

このうち,4の複合フィルタは,1~3の条件の論理値ベクトルを論理演算で組み合わせることによって新たな論理値ベクトルを作成するのでした.
これらを屈指すればいろいろな条件を作成できますよ.
ぜひ実際に手を動かして試してみてくださいね!!
それじゃ,お疲れ様でした!!

-DS講座, tidyverse, tidyverse講座