library(tidyverse)tidyverseの基本操作
1 tidyverseとは
tidyverseは,データ分析のためのRパッケージの集合体です.library(tidyverse)を実行すると,dplyr,tidyr,readr,ggplot2,purrr,tibble,stringr,forcatsなどのパッケージが一括で読み込まれます.
本書では,データの読み込み,加工,可視化にtidyverseのパッケージを多用しています.以下では,特にdplyrとtidyrの基本操作を紹介します.
2 パイプ演算子 %>%
tidyverseの特徴的な書き方が,パイプ演算子%>%です.パイプ演算子は,左側のオブジェクトを右側の関数の第1引数として渡します.
# 以下の2つは同じ操作
sqrt(9)[1] 3
9 %>% sqrt()[1] 3
パイプ演算子の利点は,複数の操作を連鎖的に記述できることです.
# パイプを使わない場合(入れ子になる)
round(sqrt(2), digits = 3)[1] 1.414
# パイプを使う場合(上から順に読める)
2 %>%
sqrt() %>%
round(digits = 3)[1] 1.414
3 tibble
tibbleは,データフレームの改良版です.data.frame()の代わりにtibble()を使って作成します.
mydata <- tibble(
name = c("太郎", "花子", "次郎"),
age = c(20, 22, 21),
score = c(80, 95, 70)
)
mydata# A tibble: 3 × 3
name age score
<chr> <dbl> <dbl>
1 太郎 20 80
2 花子 22 95
3 次郎 21 70
tibbleはコンソールに表示するとき,データの大きさや各列のクラスを表示してくれます.
4 dplyrによるデータ操作
dplyrパッケージには,データフレームを操作するための主要な関数が用意されています.
4.1 filter():行の抽出
条件に合致する行を抽出します.
mydata %>%
filter(score >= 80)# A tibble: 2 × 3
name age score
<chr> <dbl> <dbl>
1 太郎 20 80
2 花子 22 95
複数の条件を指定することもできます.
mydata %>%
filter(score >= 80, age <= 21)# A tibble: 1 × 3
name age score
<chr> <dbl> <dbl>
1 太郎 20 80
4.2 select():列の選択
特定の列だけを選択します.
mydata %>%
select(name, score)# A tibble: 3 × 2
name score
<chr> <dbl>
1 太郎 80
2 花子 95
3 次郎 70
列を除外するには,-をつけます.
mydata %>%
select(-age)# A tibble: 3 × 2
name score
<chr> <dbl>
1 太郎 80
2 花子 95
3 次郎 70
4.3 mutate():新しい変数の作成
新しい変数を追加します.既存の変数をもとに計算することができます.
mydata %>%
mutate(
score_normalized = score / 100,
passed = score >= 80
)# A tibble: 3 × 5
name age score score_normalized passed
<chr> <dbl> <dbl> <dbl> <lgl>
1 太郎 20 80 0.8 TRUE
2 花子 22 95 0.95 TRUE
3 次郎 21 70 0.7 FALSE
4.4 arrange():行の並べ替え
指定した変数の値に基づいて行を並べ替えます.
mydata %>%
arrange(score)# A tibble: 3 × 3
name age score
<chr> <dbl> <dbl>
1 次郎 21 70
2 太郎 20 80
3 花子 22 95
降順に並べ替えるには,desc()を使います.
mydata %>%
arrange(desc(score))# A tibble: 3 × 3
name age score
<chr> <dbl> <dbl>
1 花子 22 95
2 太郎 20 80
3 次郎 21 70
4.5 summarize():要約統計量の計算
データの要約統計量を計算します.
mydata %>%
summarize(
mean_score = mean(score),
sd_score = sd(score),
n = n()
)# A tibble: 1 × 3
mean_score sd_score n
<dbl> <dbl> <int>
1 81.7 12.6 3
4.6 group_by():グループ化
group_by()とsummarize()を組み合わせると,グループごとの要約統計量が計算できます.
examdata <- tibble(
class = c("A", "A", "A", "B", "B", "B"),
student = c("太郎", "花子", "次郎", "三郎", "四郎", "五郎"),
score = c(80, 95, 70, 60, 85, 90)
)
examdata %>%
group_by(class) %>%
summarize(
mean_score = mean(score),
n = n()
)# A tibble: 2 × 3
class mean_score n
<chr> <dbl> <int>
1 A 81.7 3
2 B 78.3 3
4.7 rename():変数名の変更
変数名を変更します.新しい名前 = 古い名前の形式で指定します.
mydata %>%
rename(名前 = name, 年齢 = age, 点数 = score)# A tibble: 3 × 3
名前 年齢 点数
<chr> <dbl> <dbl>
1 太郎 20 80
2 花子 22 95
3 次郎 21 70
5 tidyrによるデータの整形
5.1 pivot_longer():ワイド形式からロング形式へ
複数の列を1つの列にまとめます.
wide_data <- tibble(
name = c("太郎", "花子"),
math = c(80, 95),
english = c(70, 85)
)
wide_data# A tibble: 2 × 3
name math english
<chr> <dbl> <dbl>
1 太郎 80 70
2 花子 95 85
wide_data %>%
pivot_longer(
cols = c(math, english),
names_to = "subject",
values_to = "score"
)# A tibble: 4 × 3
name subject score
<chr> <chr> <dbl>
1 太郎 math 80
2 太郎 english 70
3 花子 math 95
4 花子 english 85
5.2 pivot_wider():ロング形式からワイド形式へ
pivot_longer()の逆の操作です.
long_data <- tibble(
name = c("太郎", "太郎", "花子", "花子"),
subject = c("math", "english", "math", "english"),
score = c(80, 70, 95, 85)
)
long_data %>%
pivot_wider(
names_from = subject,
values_from = score
)# A tibble: 2 × 3
name math english
<chr> <dbl> <dbl>
1 太郎 80 70
2 花子 95 85
6 readrによるデータの読み込み
readrパッケージのread_csv()関数を使うと,CSVファイルをtibbleとして読み込むことができます.
mydata <- read_csv("filename.csv")Rの標準関数read.csv()との違いは,read_csv()は文字列をファクターに自動変換しない点や,読み込みが高速である点です.