dplyr (データ変換)

dplyrを使ったデータ変換の話。詳細は以下でもわかる。

vignette("dplyr")
vignette("two-table")

情報源

準備

install.packages("tidyverse")
library(tidyverse)

基本

  • filter(): 行データの条件抽出
    filter(data,x>1) # 列xのデータ値が1より大きいものを抽出
    
  • slice(): 行データの切り出し
    data %>% slice(5:10)
    data %>% slice(n())  # 最後の行だけ(n()はデータ数)
    data %>% slice(-5:-n())  # 5から最後の行**以外**
    
  • arrange(): ソート
  • select(): 列データの取り出し
    data %>% select(year,month,day) # year, month, dayの列を取り出す
    data %>% select(year:day) # year,month,dayの列が隣接していたら上と同じ
    data %>% select(-(year:day)) # year:day 以外を取り出す
    data %>% select(ends_with("time")) # "time"で終わる列名のデータを取り出す
    
    • 列名の変更にも使える。ただし,指定した列以外のデータはなくなる。単にある列名のみを変えたいならrename()を使う。
    • 列の並び替えにも使える。順番を変更しない列群についてはeverything()と書いておけば良い。
    data %>% select(year, month, date, everything())
    
  • mutate(): 列を追加
    mutate(data,
      duration = start_time - end_time, # 2つの列の差をdataに加える
      speed = distance / duration  # 2つの列の演算結果を加える
    )
    
    元データを捨てて,新規列のみ加えたいときには transmute() を使う
  • summarise(): 集計処理
    • データフレームのデータ中の各グループ(grou_by()で指定)に対して,平均値を計算する等の処理を行う。
    • スペルは**summarize()**でもOK。
    • 以下は,毎日の気温データdataをyear,monthでグループ分けして,月ごとの平均気温を計算する例。
    by_month <- group_by(data, year, month) # yearを指定しないと,異なる年の同じ月のデータが,同じグループになる。
    summarise(by_month, temp_mean = mean(temperature, na.rm = TRUE))
    

summarise()mutate()には変形版*_all, *_each, *_at, *_ifがある。

  • *_all: すべての列に関数を適用
    length_dat %>% mutate_all(funs(. / 2.54))
    length_dat %>% mutate_all(funs(inches = . / 2.54))
    
  • *_at: 特定の名前の列に関数を適用
    starwars %>% summarise_at(c("height", "mass"), mean)
    starwars %>% summarise_at(vars(height:mass), mean)
    iris %>% mutate_at(vars(starts_with("Sepal")), log)
    iris %>% mutate_at(vars(matches("Sepal")), funs(./2))
    
    matchesstarts_with等では正規表現も使える
  • *_if: 特定の条件を満たす列に関数を適用
    starwars %>% summarise_if(is.numeric, mean) # numericの列の平均
    iris %>% mutate_if(is.double, as.integer) # doubleの列をintegerにする
    

いろいろな関数

データフレームの階層化

  • nest(): データフレームを階層化
    dataset %>% nest(-city) # city コラムを外のほうに残す
    
  • unnest(): 階層化したデータフレームをもどす

列や行の追加

同じ列幅や行数の2つのデータフレームを結合させるときにはbind_rows()bind_cols()を使う。 rbind()cbind()のデータフレーム用関数。

tibbleの結合

キーとなる列情報を使って2のtibbleを結合するにはfull_join()とか,right_joint()とかを使う。データベース関数のjoinと同じようなもの。

その他

  • lead(), lag(): 前後の行の値を参照(列ベクトルに対するシフト演算)
  • dplyrの関数一覧
    • if_else(), case_when(): 特定の要素や欠損値に対する処理をできる
    • recode(): ベクトルの特定の値のみを変更できる