dplyr::filter
dplyr::filter
は、tidyverse コレクションの dplyr パッケージに含まれる関数で、特定の条件に基づいてデータフレームから行を抽出するために使用される。
クイックリファレンス
library(tidyverse)
df %>%
filter(condition)
penguins %>%
filter(species == "Adelie" & body_mass_g > 4000)
# # A tibble: 35 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.2 19.6 195 4675 male
# 2 Adelie Torgersen 42 20.2 190 4250 NA
# 3 Adelie Torgersen 34.6 21.1 198 4400 male
# 4 Adelie Torgersen 42.5 20.7 197 4500 male
# 5 Adelie Torgersen 46 21.5 194 4200 male
# 6 Adelie Dream 39.2 21.1 196 4150 male
# 7 Adelie Dream 39.8 19.1 184 4650 male
# 8 Adelie Dream 44.1 19.7 196 4400 male
# 9 Adelie Dream 39.6 18.8 190 4600 male
# 10 Adelie Dream 42.3 21.2 191 4150 male
# # ℹ 25 more rows
# # ℹ Use `print(n = ...)` to see more rows
基本構文
filter(.data, ..., .by = NULL, .preserve = FALSE)
引数 | 説明 |
---|---|
.data | データフレーム(または tibble)。 |
... | 条件式(論理値を返す式)。複数の式が含まれる場合、AND 演算子で結合される。 |
.by = NULL | グループ化したい列を指定する。<tidy-select> も指定可能。 |
.preserve = FALSE | 条件式にマッチしないグループ情報を残すかどうか。 |
よく使う条件式は、以下の通り。
条件式 | 意味 |
---|---|
列 == 値 / 列 != 値 | 列が指定した値と等しい / 等しくない。 |
列 > 値 / 列 < 値 | 列が指定した値より大きい / 小さい。 |
列 >= 値 / 列 <= 値 | 列が指定した値以上 / 以下。 |
dplyr::between(列, 値1, 値2) | 列が指定した 2 つの範囲内。 |
列 %in% c(値1, 値2, ...) | 列が指定した値のいずれかと等しい。 |
is.na(列) / !is.na(列) | 列が欠損値である / ではない。 |
stringr::str_detect(列, 正規表現) | 列が指定した正規表現にマッチする。 |
複合条件を指定するには、&
(論理積)や |
(論理和)を用いる。
使用例
1. 数値フィルタ
penguins %>%
filter(body_mass_g > 5000)
# # A tibble: 61 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Gentoo Biscoe 50 16.3 230 5700 male
# 2 Gentoo Biscoe 50 15.2 218 5700 male
# 3 Gentoo Biscoe 47.6 14.5 215 5400 male
# 4 Gentoo Biscoe 46.7 15.3 219 5200 male
# 5 Gentoo Biscoe 46.8 15.4 215 5150 male
# 6 Gentoo Biscoe 49 16.1 216 5550 male
# 7 Gentoo Biscoe 48.4 14.6 213 5850 male
# 8 Gentoo Biscoe 49.3 15.7 217 5850 male
# 9 Gentoo Biscoe 49.2 15.2 221 6300 male
# 10 Gentoo Biscoe 48.7 15.1 222 5350 male
# # ℹ 51 more rows
# # ℹ Use `print(n = ...)` to see more rows
dplyr::between
を使用すれば、範囲指定することが できる。
penguins %>%
filter(between(flipper_length_mm, 190, 200))
# # A tibble: 117 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 40.3 18 195 3250 female
# 2 Adelie Torgersen 36.7 19.3 193 3450 female
# 3 Adelie Torgersen 39.3 20.6 190 3650 male
# 4 Adelie Torgersen 39.2 19.6 195 4675 male
# 5 Adelie Torgersen 34.1 18.1 193 3475 NA
# 6 Adelie Torgersen 42 20.2 190 4250 NA
# 7 Adelie Torgersen 38.6 21.2 191 3800 male
# 8 Adelie Torgersen 34.6 21.1 198 4400 male
# 9 Adelie Torgersen 38.7 19 195 3450 female
# 10 Adelie Torgersen 42.5 20.7 197 4500 male
# # ℹ 107 more rows
# # ℹ Use `print(n = ...)` to see more rows
これは次のフィルタリングの結果と同じである。
penguins %>%
filter(flipper_length_mm >= 190 & flipper_length_mm <= 200)
# # A tibble: 117 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 40.3 18 195 3250 female
# 2 Adelie Torgersen 36.7 19.3 193 3450 female
# 3 Adelie Torgersen 39.3 20.6 190 3650 male
# 4 Adelie Torgersen 39.2 19.6 195 4675 male
# 5 Adelie Torgersen 34.1 18.1 193 3475 NA
# 6 Adelie Torgersen 42 20.2 190 4250 NA
# 7 Adelie Torgersen 38.6 21.2 191 3800 male
# 8 Adelie Torgersen 34.6 21.1 198 4400 male
# 9 Adelie Torgersen 38.7 19 195 3450 female
# 10 Adelie Torgersen 42.5 20.7 197 4500 male
# # ℹ 107 more rows
# # ℹ Use `print(n = ...)` to see more rows
2. 文字列フィルタ
penguins %>%
filter(sex == "male")
# # A tibble: 168 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.1 18.7 181 3750 male
# 2 Adelie Torgersen 39.3 20.6 190 3650 male
# 3 Adelie Torgersen 39.2 19.6 195 4675 male
# 4 Adelie Torgersen 38.6 21.2 191 3800 male
# 5 Adelie Torgersen 34.6 21.1 198 4400 male
# 6 Adelie Torgersen 42.5 20.7 197 4500 male
# 7 Adelie Torgersen 46 21.5 194 4200 male
# 8 Adelie Biscoe 37.7 18.7 180 3600 male
# 9 Adelie Biscoe 38.2 18.1 185 3950 male
# 10 Adelie Biscoe 38.8 17.2 180 3800 male
# # ℹ 158 more rows
# # ℹ Use `print(n = ...)` to see more rows
%in%
演算子を使用すれば、複数の要素のいずれかに一致するものを抽出することができる。
penguins %>%
filter(island %in% c("Torgersen", "Biscoe"))
# # A tibble: 220 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.1 18.7 181 3750 male
# 2 Adelie Torgersen 39.5 17.4 186 3800 female
# 3 Adelie Torgersen 40.3 18 195 3250 female
# 4 Adelie Torgersen NA NA NA NA NA
# 5 Adelie Torgersen 36.7 19.3 193 3450 female
# 6 Adelie Torgersen 39.3 20.6 190 3650 male
# 7 Adelie Torgersen 38.9 17.8 181 3625 female
# 8 Adelie Torgersen 39.2 19.6 195 4675 male
# 9 Adelie Torgersen 34.1 18.1 193 3475 NA
# 10 Adelie Torgersen 42 20.2 190 4250 NA
# # ℹ 210 more rows
# # ℹ Use `print(n = ...)` to see more rows
これは次のフィルタリングの結果と同じである。
penguins %>%
filter(island == "Torgersen" | island == "Biscoe")
# # A tibble: 220 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.1 18.7 181 3750 male
# 2 Adelie Torgersen 39.5 17.4 186 3800 female
# 3 Adelie Torgersen 40.3 18 195 3250 female
# 4 Adelie Torgersen NA NA NA NA NA
# 5 Adelie Torgersen 36.7 19.3 193 3450 female
# 6 Adelie Torgersen 39.3 20.6 190 3650 male
# 7 Adelie Torgersen 38.9 17.8 181 3625 female
# 8 Adelie Torgersen 39.2 19.6 195 4675 male
# 9 Adelie Torgersen 34.1 18.1 193 3475 NA
# 10 Adelie Torgersen 42 20.2 190 4250 NA
# # ℹ 210 more rows
# # ℹ Use `print(n = ...)` to see more rows
また、stringr::str_detect
を使用して、文字列のパターンマッチング(部分一致、前方一致、後方一致、正規表現一致)を行うことができる。
penguins %>%
filter(str_detect(island, r"(^T)"))
# # A tibble: 52 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.1 18.7 181 3750 male
# 2 Adelie Torgersen 39.5 17.4 186 3800 female
# 3 Adelie Torgersen 40.3 18 195 3250 female
# 4 Adelie Torgersen NA NA NA NA NA
# 5 Adelie Torgersen 36.7 19.3 193 3450 female
# 6 Adelie Torgersen 39.3 20.6 190 3650 male
# 7 Adelie Torgersen 38.9 17.8 181 3625 female
# 8 Adelie Torgersen 39.2 19.6 195 4675 male
# 9 Adelie Torgersen 34.1 18.1 193 3475 NA
# 10 Adelie Torgersen 42 20.2 190 4250 NA
# # ℹ 42 more rows
# # ℹ Use `print(n = ...)` to see more rows
3. 欠損値フィルタ
base::is.na
を使用すると、欠損値( NA
)を抽出することができる。
penguins %>%
filter(is.na(sex))
# # A tibble: 11 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen NA NA NA NA NA
# 2 Adelie Torgersen 34.1 18.1 193 3475 NA
# 3 Adelie Torgersen 42 20.2 190 4250 NA
# 4 Adelie Torgersen 37.8 17.1 186 3300 NA
# 5 Adelie Torgersen 37.8 17.3 180 3700 NA
# 6 Adelie Dream 37.5 18.9 179 2975 NA
# 7 Gentoo Biscoe 44.5 14.3 216 4100 NA
# 8 Gentoo Biscoe 46.2 14.4 214 4650 NA
# 9 Gentoo Biscoe 47.3 13.8 216 4725 NA
# 10 Gentoo Biscoe 44.5 15.7 217 4875 NA
# 11 Gentoo Biscoe NA NA NA NA NA
欠損値ではない行を抽出したい場合は、!base::is.na
とする。
penguins %>%
filter(!is.na(sex))
# # A tibble: 333 × 7
# species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
# <fct> <fct> <dbl> <dbl> <int> <int> <fct>
# 1 Adelie Torgersen 39.1 18.7 181 3750 male
# 2 Adelie Torgersen 39.5 17.4 186 3800 female
# 3 Adelie Torgersen 40.3 18 195 3250 female
# 4 Adelie Torgersen 36.7 19.3 193 3450 female
# 5 Adelie Torgersen 39.3 20.6 190 3650 male
# 6 Adelie Torgersen 38.9 17.8 181 3625 female
# 7 Adelie Torgersen 39.2 19.6 195 4675 male
# 8 Adelie Torgersen 41.1 17.6 182 3200 female
# 9 Adelie Torgersen 38.6 21.2 191 3800 male
# 10 Adelie Torgersen 34.6 21.1 198 4400 male
# # ℹ 323 more rows
# # ℹ Use `print(n = ...)` to see more rows