tidyverseの基本操作

library(tidyverse)

1 tidyverseとは

tidyverseは,データ分析のためのRパッケージの集合体です.library(tidyverse)を実行すると,dplyrtidyrreadrggplot2purrrtibblestringrforcatsなどのパッケージが一括で読み込まれます.

本書では,データの読み込み,加工,可視化にtidyverseのパッケージを多用しています.以下では,特にdplyrtidyrの基本操作を紹介します.

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()は文字列をファクターに自動変換しない点や,読み込みが高速である点です.