はじめに
今回はデータフレームの行をフィルターする関数filter()
関数を紹介したいと思います。条件に合う値だけを抽出する時に覚えておきたい関数なのぜひマスターしましょう。
filter関数の使い方
filter
関数はdplyr
パッケージに含まれる関数の1つで、データフレームの指定した列の値に対して指定した条件でフィルタリングを行う関数です。
filter
関数の基本的な使い方は以下の通りです。
library(dplyr) filter(対象データフレーム、フィルタリング条件)
- 対象データフレーム:フィルターをかけたいデータフレーム
- フィルタリング条件:TRUE/FALSEが返り値になるような条件式なら何でも可(直接TRUEやFALSEを並べたベクトルを指定することも出来ます)
具体例
今回はdplyr
パッケージのstorms
データを使って色々なパターンのフィルタリングをやってみたいと思います。
完全一致
まず一つ目の例として指定した列の値が指定した条件と完全に一致するかどうかでフィルターする例を紹介します。
完全一致するかどうかでフィルタリングするときは第2引数に 「対象の列 == 条件」を指定します。
今回はstorms
データの name 列が Amy となっている行だけをフィルタリングするコードを紹介します。
library(dplyr) data = dplyr::storms filter(data, name == "Amy")
出力される結果の頭10行はこんな感じになります。(クリックで表示)
name | year | month | day | hour | lat | long | status | category | wind | pressure | ts_diameter | hu_diameter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Amy | 1975 | 6 | 27 | 0 | 27.5 | -79 | tropical depression | -1 | 25 | 1013 | NA | NA |
Amy | 1975 | 6 | 27 | 6 | 28.5 | -79 | tropical depression | -1 | 25 | 1013 | NA | NA |
Amy | 1975 | 6 | 27 | 12 | 29.5 | -79 | tropical depression | -1 | 25 | 1013 | NA | NA |
Amy | 1975 | 6 | 27 | 18 | 30.5 | -79 | tropical depression | -1 | 25 | 1013 | NA | NA |
Amy | 1975 | 6 | 28 | 0 | 31.5 | -78.8 | tropical depression | -1 | 25 | 1012 | NA | NA |
Amy | 1975 | 6 | 28 | 6 | 32.4 | -78.7 | tropical depression | -1 | 25 | 1012 | NA | NA |
Amy | 1975 | 6 | 28 | 12 | 33.3 | -78 | tropical depression | -1 | 25 | 1011 | NA | NA |
Amy | 1975 | 6 | 28 | 18 | 34 | -77 | tropical depression | -1 | 30 | 1006 | NA | NA |
Amy | 1975 | 6 | 29 | 0 | 34.4 | -75.8 | tropical storm | 0 | 35 | 1004 | NA | NA |
Amy | 1975 | 6 | 29 | 6 | 34 | -74.8 | tropical storm | 0 | 40 | 1002 | NA | NA |
指定の値以上/以下
二つ目の例として指定した列の数値が指定した値以上もしくは以下となるかどうかでフィルターする方法を紹介します。
こちらは 第2引数に不等式を指定します。今回はstorms
データの year 列が 2010 以上となる行をフィルタリングします。
library(dplyr) data = dplyr::storms filter(data, year >= 2010)
出力される結果の頭10行はこんな感じになります。(クリックで表示)
name | year | month | day | hour | lat | long | status | category | wind | pressure | ts_diameter | hu_diameter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Alex | 2010 | 6 | 25 | 18 | 16.4 | -83.1 | tropical depression | -1 | 30 | 1005 | 0 | 0 |
Alex | 2010 | 6 | 26 | 0 | 16.6 | -83.9 | tropical depression | -1 | 30 | 1004 | 0 | 0 |
Alex | 2010 | 6 | 26 | 6 | 16.7 | -84.9 | tropical storm | 0 | 40 | 1004 | 103.5702 | 0 |
Alex | 2010 | 6 | 26 | 12 | 16.9 | -86.1 | tropical storm | 0 | 40 | 1004 | 103.5702 | 0 |
Alex | 2010 | 6 | 26 | 18 | 17.2 | -87.2 | tropical storm | 0 | 55 | 996 | 149.6014 | 0 |
Alex | 2010 | 6 | 27 | 0 | 17.5 | -88.2 | tropical storm | 0 | 55 | 995 | 138.0936 | 0 |
Alex | 2010 | 6 | 27 | 6 | 18 | -89.1 | tropical storm | 0 | 55 | 991 | 138.0936 | 0 |
Alex | 2010 | 6 | 27 | 12 | 18.5 | -90 | tropical storm | 0 | 45 | 992 | 103.5702 | 0 |
Alex | 2010 | 6 | 27 | 18 | 18.9 | -90.7 | tropical storm | 0 | 35 | 993 | 69.0468 | 0 |
Alex | 2010 | 6 | 28 | 0 | 19.2 | -91.1 | tropical storm | 0 | 40 | 991 | 103.5702 | 0 |
複数条件で指定
次に複数の条件を組み合わせてフィルターする方法を紹介します。
こちらは第2引数に条件式を 「&」や「|」で複数指定します。ちなみに「&」は AND 条件でどちらの条件も満たしているものが対象になり、「|」は OR 条件でどちらかの条件を満たせば対象になります。
今回はstorms
データの year 列が 2010 以上となり、なおかつ pressure 列が 935 より小さい行を抽出するコードを紹介します。
library(dplyr) data = dplyr::storms filter(data, year >= 2010 & pressure < 935)
出力される結果はこんな感じになります。(クリックで表示)
name | year | month | day | hour | lat | long | status | category | wind | pressure | ts_diameter | hu_diameter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Igor | 2010 | 9 | 13 | 12 | 17.6 | -49.3 | hurricane | 4 | 130 | 933 | 310.7106 | 86.3085 |
Igor | 2010 | 9 | 14 | 18 | 18.6 | -52.8 | hurricane | 4 | 125 | 933 | 391.2652 | 86.3085 |
Igor | 2010 | 9 | 15 | 0 | 18.9 | -53.5 | hurricane | 4 | 135 | 924 | 391.2652 | 86.3085 |
Igor | 2010 | 9 | 16 | 6 | 20.4 | -56.5 | hurricane | 4 | 125 | 929 | 483.3276 | 120.8319 |
Igor | 2010 | 9 | 16 | 12 | 20.8 | -57.1 | hurricane | 4 | 120 | 934 | 483.3276 | 120.8319 |
Joaquin | 2015 | 10 | 2 | 0 | 22.9 | -74.4 | hurricane | 4 | 120 | 931 | 333.7262 | 92.0624 |
Joaquin | 2015 | 10 | 3 | 12 | 25.4 | -72.6 | hurricane | 4 | 135 | 934 | 333.7262 | 109.3241 |
Joaquin | 2015 | 10 | 3 | 18 | 26.3 | -71 | hurricane | 4 | 130 | 934 | 333.7262 | 109.3241 |
文字列の部分一致
最後に指定した文字が含まれているかでフィルターする方法を紹介します。文字列を曖昧に指定する時はstringr
パッケージのstr_detect
関数を応用します。str_detect
関数は文字列を検出できるかどうかで論理値(TRUE/FALSE)を返す関数です。今回はまずstorms
データの name 列に 「H」 が含まれる行をフィルタリングして、その後、name列に重複した値がないように行を抽出するコードを紹介します。
library(dplyr) library(stringr) # str_detectを使うために呼び出す data = dplyr::storms filtered = filter(data, str_detect(name, "H")) # nameにHが含まれている行をフィルタリングする distinct(filtered, name, .keep_all = T) # nameが重複しないように取り出す
出力される結果はこんな感じになります。(クリックで表示)
name | year | month | day | hour | lat | long | status | category | wind | pressure | ts_diameter | hu_diameter |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Henri | 1979 | 9 | 15 | 0 | 20.3 | -86.8 | tropical depression | -1 | 25 | 1003 | NA | NA |
Hermine | 1980 | 9 | 20 | 12 | 14.6 | -77.2 | tropical depression | -1 | 25 | 1008 | NA | NA |
Harvey | 1981 | 9 | 11 | 18 | 14 | -49 | tropical depression | -1 | 25 | 1009 | NA | NA |
Hortense | 1984 | 9 | 24 | 18 | 28.5 | -60.1 | tropical storm | 0 | 40 | 999 | NA | NA |
Hugo | 1989 | 9 | 10 | 12 | 13.2 | -20 | tropical depression | -1 | 25 | 1010 | NA | NA |
Humberto | 1995 | 8 | 22 | 0 | 13.2 | -33 | tropical depression | -1 | 30 | 1009 | NA | NA |
Hanna | 2002 | 9 | 12 | 0 | 26.3 | -86.6 | tropical depression | -1 | 30 | 1001 | NA | NA |
まとめ
今回はfilter
関数を使ってフィルタリングする方法を紹介しました。大量のレコードがあるデータセットを整理するときのは必ずといって良いほど必要なスキルだと思いますので、ぜひマスターしてみてください。