統計プログラムRの勉強日記

Rに関して勉強してきたことを紹介します

【R】データフレームをフィルタリングする方法|filter関数

filter関数タイトル

はじめに

今回はデータフレームの行をフィルターする関数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関数を使ってフィルタリングする方法を紹介しました。大量のレコードがあるデータセットを整理するときのは必ずといって良いほど必要なスキルだと思いますので、ぜひマスターしてみてください。