dplyrを使ったデータ変換の話。詳細は以下でもわかる。
vignette("dplyr")
vignette("two-table")
install.packages("tidyverse")
library(tidyverse)
filter(data,x>1) # 列xのデータ値が1より大きいものを抽出
data %>% slice(5:10)
data %>% slice(n()) # 最後の行だけ(n()はデータ数)
data %>% slice(-5:-n()) # 5から最後の行**以外**
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"で終わる列名のデータを取り出す
everything()
と書いておけば良い。data %>% select(year, month, date, everything())
mutate(data,
duration = start_time - end_time, # 2つの列の差をdataに加える
speed = distance / duration # 2つの列の演算結果を加える
)
元データを捨てて,新規列のみ加えたいときには transmute() を使うgrou_by()
で指定)に対して,平均値を計算する等の処理を行う。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))
matches
やstarts_with
等では正規表現も使える*_if
: 特定の条件を満たす列に関数を適用
starwars %>% summarise_if(is.numeric, mean) # numericの列の平均
iris %>% mutate_if(is.double, as.integer) # doubleの列をintegerにする
同じ列幅や行数の2つのデータフレームを結合させるときにはbind_rows()やbind_cols()を使う。
rbind()
やcbind()
のデータフレーム用関数。
キーとなる列情報を使って2のtibbleを結合するにはfull_join()とか,right_joint()とかを使う。データベース関数のjoinと同じようなもの。
if_else()
, case_when()
: 特定の要素や欠損値に対する処理をできるrecode()
: ベクトルの特定の値のみを変更できる