Skip to main content

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