行の抽出

順番を基準に行を抽出

dplyr::slice

  • 指定した行を抽出
  • 例えば、以下は先頭から10行分を抽出するコード
dplyr::storms |> 
  dplyr::slice(1:10)

条件に当てはまる行の抽出

dplyr::filter

  • 条件に一致する行を抽出
    • 引数には条件文を入力

数値での条件指定

dplyr::storms |> 
  dplyr::filter(year >= 2010) # 2010年以降のデータを抽出

文字列での条件指定

dplyr::storms |> 
  dplyr::filter(name == "Dolly") # name が Dolly のデータを抽出

条件の並列

  • \& (=and)、\| (=or) 演算子を使う
dplyr::storms |> 
  dplyr::filter(name == "Dolly" & year == 2020) # name が Dolly で、かつ2020年のデータを抽出
dplyr::storms |> 
  dplyr::filter(name == "Dolly" | year == 2020) # name が Dolly か、もしくは2020年のデータを抽出
  • 「〜以上〜以下」: filter(between())
dplyr::storms |> 
  dplyr::filter(
    wind |> dplyr::between(75, 100)
    ) # wind が75以上100以下のデータを抽出

if_any と if_all

  • dplyr::if_any(列名, 条件)
    • 指定した列のうち少なくとも1列以上条件を満たした行すべて
tidyr::billboard |> 
  dplyr::filter(
    dplyr::if_any(dplyr::starts_with("wk"), ~ . < 10) ## wkから始まる列の中で、1列でも10未満の値がある行を全て抽出
    ) 
  • dplyr::if_all(列名, 条件)
    • 指定した列すべてで条件を満たした行すべて
tidyr::billboard |> 
  dplyr::filter(
    dplyr::if_all(dplyr::num_range("wk", 1:20), ~ . < 50) ## wk1からwk20までの列の中で、全ての列の値が50未満である行を全て抽出
    ) 

否定条件

  • !を式の前に付ければ 否定 となる
    • なお、==の否定は!=と表記
dplyr::storms |> 
  dplyr::filter(!(year < 2000) & status != "tropical wave
") # 2000年以前ではなく、 (=2000年以降の) かつ status が tropical wave でないデータを抽出
  • dplyr::filter( !is.na() ) でもNA行の除外が可能
    • 対象列が1行ならdplyr::filterの方が楽かもしれないが、複数行にまたがるならtidyr::drop_na() の使用を推奨
dplyr::starwars |> 
  dplyr::filter(!is.na(hair_color))

正規表現による条件指定

  • filter( str_detect(列名, “正規表現”) )
  dplyr::storms |> 
  dplyr::filter(
    status |> stringr::str_detect("^tropical") # statusがtropicalで始まる行を抽出
    )