👻

filterとselectの使い方(R)(随時更新)

2024/11/27に公開

filterとselectのちょっと応用的な使い方

関数を作ったり、列数の多いデータを扱ったりしていると、“一定の法則で作成・抽出した文字列を使用してfilterをかけたりselectしたりしたい”というニーズがよく出てきます。
これまでその都度ネットで調べたりして対応してきましたが、ここらで各方法をまとめてネットに還元しようと思いました。
逆引き事典的な使い方ができれば自分にとっても便利ですので。

library(tidyverse)

変数で指定した列に対してfilterをかける。

変数に格納した文字列の列名を使用してfilterをかけます。

sw <- head(starwars)
sw
#> # A tibble: 6 × 14
#>   name      height  mass hair_color skin_color eye_color birth_year sex   gender
#>   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr>
#> 1 Luke Sky…    172    77 blond      fair       blue            19   male  mascu…
#> 2 C-3PO        167    75 <NA>       gold       yellow         112   none  mascu…
#> 3 R2-D2         96    32 <NA>       white, bl… red             33   none  mascu…
#> 4 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
#> 5 Leia Org…    150    49 brown      light      brown           19   fema… femin…
#> 6 Owen Lars    178   120 brown, gr… light      blue            52   male  mascu…
#> # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#> #   vehicles <list>, starships <list>

hair_colorに含まれる欠損値を除外してみます。

nm <- "hair_color"
sw |>
  filter(if_any(all_of(nm), \(x) !is.na(x)))
#> # A tibble: 4 × 14
#>   name      height  mass hair_color skin_color eye_color birth_year sex   gender
#>   <chr>      <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> <chr>
#> 1 Luke Sky…    172    77 blond      fair       blue            19   male  mascu…
#> 2 Darth Va…    202   136 none       white      yellow          41.9 male  mascu…
#> 3 Leia Org…    150    49 brown      light      brown           19   fema… femin…
#> 4 Owen Lars    178   120 brown, gr… light      blue            52   male  mascu…
#> # ℹ 5 more variables: homeworld <chr>, species <chr>, films <list>,
#> #   vehicles <list>, starships <list>

Discussion