Chapter 6 データのハンドリング

6.1 データ

  • Rはデータ分析(統計解析)を行うのが主な機能
    • それ以外も色々できるが…

6.1.1 データとは?

  • 構造化データと非構造化データ
    • 構造化:定義済みの形式に整理されている(行列で定義できる)
    • 非構造化:形式化が難しい(テキストデータ、音声データなど)
    • 半構造化データ:ある程度の構造は持つが、データベースのような形式になっていないもの(例:xml, json)
  • Rでは基本的に構造化データを扱う
    • テキストデータなども扱えるが、授業では扱わない

6.1.2 データフレーム

  • Rでは基本的にデータをデータフレームという形で扱う
  • データフレームは行と列を持つ形式

6.1.3 行と列

行と列は方向が決まっている。横が行(row)、縦が列(column)である。

行と列の覚え方

6.1.4 きれいなデータ?

  • 人間の見やすいデータ形式(表)とコンピュータが処理しやすいデータ形式は異なる。
  • 同じ情報をもつデータフレームであっても、形式が異なるものがあることを理解しよう。
  • 冒頭で出た武蔵大学経済学部の学生数のデータを見てみよう。

6.2 データの読み込み

  • データはデータファイルから読み込む
    • ファイルがある場所のpathを指定する。
  • データファイルの形式はExcelや.csv, .dta, .rdsなど様々
    • 形式によって使う関数が異なる。
  • 例えば
    • Excelなら、readxlパッケージのread_excel
    • csvなら、readrパッケージのread_csv
    • いずれもtidyverseパッケージ群に含まれている

ここではエクセル形式について説明するが、その他のファイル形式については私達のRの第8章を参照してほしい

6.2.1 演習: データの読み込み

csvを読み込むにはread_excel()関数を使う。この関数はreadxlパッケージ含まれている。

  1. readxlパッケージをインストールする。

  2. r_renshuフォルダにdataフォルダを作成し、武蔵大学経済学部の学生数データをこちらからダウンロードして保存するか、以下のコードを実行する。

# data ディレクトリの作成
fs::dir_create("data")

# データのダウンロードと保存
download.file(url="https://keita43a.github.io/regression_tutorial/data/musashi_keizai_students_2023.xlsx",
              destfile = "data/musashi_keizai_students_2023.xlsx")
  1. Rスクリプトを作成し、data_mgt.Rという名前をつけて保存する。

  2. Rスクリプトの冒頭でパッケージを読み込む

library(tidyverse)
library(readxl)
  1. Rスクリプトに以下のコードを書きこみ、データを読み込む。
data_634 <- read_excel("data/musashi_keizai_students_2023.xlsx")
  • Error: path does not exist:’というエラーが出る場合は、ファイルの相対パスが間違っている可能性がある
    • r_renshuプロジェクトを開いていることを確認する
    • getwd()で自分がr_renshuフォルダにいることを確認する
    • musashi_keizai_students_2023.xlsxがきちんとdataフォルダに入っていることを確認する

6.2.2 日本語のデータを読み込む際の注意点

日本語のファイルを読み込む時に、問題になる可能性があるのがエンコーディングである。

エンコーディングとは、データを一定の規則に従って目的の情報に変換することで、とくに文字を扱う上で、それぞれの文字に番号を割り当てる符号化を行っている。

最近ではよりグローバルなUnicodeが使われており、tidyverseのパッケージもunicodeあるUTF-8をデフォルトとして使用する。しかし、日本語のファイルの中にはShift-JISというエンコーディングで作成されているファイルもある。

例えば、こちらのファイルをそのまま読み込んで見る。

product_cp932 = read_csv("data/Products_cp932.csv")
product_cp932
## # A tibble: 6 × 6
##    ...1 ProductID ProductName Price Category                              CreatedDate
##   <dbl>     <dbl> <chr>       <dbl> <chr>                                 <date>     
## 1     1         1 YKDJw        1122 "\x83w\x83\x8b\x83X&\x83r\x83\x85\x8… 2005-08-30 
## 2     2         2 ftKQ7        1877 "\x83w\x83\x8b\x83X&\x83r\x83\x85\x8… 2006-07-01 
## 3     3         3 l8lqm        3754 "\x89\xc6\x8b\xef\x81E\x83C\x83\x93\… 2005-05-26 
## 4     4         4 8ntvc        8242 "\x89\xd4\x81E\x83O\x83\x8a\x81[\x83… 2005-09-06 
## 5     5         5 HhDBS        4461 "\x90H\x95i"                          2010-12-28 
## 6     6         6 PKIs3        4963 "\x8eG\x89\xdd\x81E\x93\xfa\x97p\x95… 2005-02-09

Categoryという変数が文字化けしてしまっているのがわかる。

ファイルのエンコーディングを調べることができる。 readrパッケージもに入っているguess_encodingを使うと、Shift-JISである可能性が高いことがわかる。

guess_encoding("data/Products_cp932.csv")
## # A tibble: 3 × 2
##   encoding     confidence
##   <chr>             <dbl>
## 1 Shift_JIS          1   
## 2 windows-1252       0.31
## 3 windows-1250       0.31

read_csvのオプションを使って、encodingを指定する。Shift-JISはCP932というエンコーディングになっている。

product_enc = read_csv("data/Products_cp932.csv", locale=locale(encoding="CP932"))
product_enc
## # A tibble: 6 × 6
##    ...1 ProductID ProductName Price Category               CreatedDate
##   <dbl>     <dbl> <chr>       <dbl> <chr>                  <date>     
## 1     1         1 YKDJw        1122 ヘルス&ビューティー    2005-08-30 
## 2     2         2 ftKQ7        1877 ヘルス&ビューティー    2006-07-01 
## 3     3         3 l8lqm        3754 家具・インテリア・家電 2005-05-26 
## 4     4         4 8ntvc        8242 花・グリーン           2005-09-06 
## 5     5         5 HhDBS        4461 食品                   2010-12-28 
## 6     6         6 PKIs3        4963 雑貨・日用品           2005-02-09

文字化けなく読み込めた。

6.2.3 readrのその他のオプション

readrでは以下のオプションを引数に指定することで設定できる。

引数 デフォルトの値 意味
col_names TRUE 1行目を列名にするか
na c(““,”NA”) 欠損値を表す文字列
comment “” コメント開始文字
skip 0 先頭何行を無視するか
n_max Inf 何行目までを読み込むか
trim_ws TRUE 前後の空白文字を無視するか

6.3 tidy data (整然データ)

武蔵大学経済学部の学生数データを見てみよう。

学科 性別 4年 3年 2年 1年
経済学科 140 121 139 133
経済学科 38 46 50 38
経営学科 117 111 121 129
経営学科 52 62 53 62
金融学科 108 107 90 93
金融学科 24 33 29 36
## エクセルからデータを読み込み
data_634 <- read_excel("data/musashi_keizai_students_2023.xlsx") 

knitr::kable(data_634) ## kableは見やすい表を出力する関数

このデータは、人間の目に見やすい形式になっている。学科・性別と学年がクロス表形式になっているため、何年生の何学科の男女が何人いるか見やすい表になっている。このような形のデータは横型(wide型)と呼ばれる。

同じデータを、異なる形式で表示したものが以下である。

print(as.data.frame(data_634_long))
##        学科 性別 学年 学生数
## 1  経済学科   男  1年    133
## 2  経済学科   男  2年    139
## 3  経済学科   男  3年    121
## 4  経済学科   男  4年    140
## 5  経済学科   女  1年     38
## 6  経済学科   女  2年     50
## 7  経済学科   女  3年     46
## 8  経済学科   女  4年     38
## 9  経営学科   男  1年    129
## 10 経営学科   男  2年    121
## 11 経営学科   男  3年    111
## 12 経営学科   男  4年    117
## 13 経営学科   女  1年     62
## 14 経営学科   女  2年     53
## 15 経営学科   女  3年     62
## 16 経営学科   女  4年     52
## 17 金融学科   男  1年     93
## 18 金融学科   男  2年     90
## 19 金融学科   男  3年    107
## 20 金融学科   男  4年    108
## 21 金融学科   女  1年     36
## 22 金融学科   女  2年     29
## 23 金融学科   女  3年     33
## 24 金融学科   女  4年     24

このデータでは「人数」という一つの変数のみの列があり、その他の属性もすべて縦の項目で表されている。これは、コンピューターによって処理しやすい形式であり、ベクトルの処理が得意なRでは縦長の形式が扱いやすい。

この縦長形式のデータをtidy data(整然データ)と呼ぶ

tidy dataの定義

  • 一つの列が一つの変数を表す
  • 一つの行が一つの観測を表す
  • 一つのテーブルが一つのデータセットだけを含む

Rの中でもtidy dataでないデータが好ましい場合もある。しかし、tidy dataを基本にしておけば、そこから加工することは容易である。

6.4 データフレームを扱うテクニック:パイプ

データフレームを操作する関数の共通点

  • 第1引数がデータフレーム
  • 第2引数以降はそのデータフレームに対する操作
  • 結果がデータフレームとして返される

6.4.1 パイプ

パイプ(|>)は「これまでの処理を次の第1引数として引き渡す」という機能を持つ。 パイプはかつて%>%と書かれていて、tidyverse群の一つであるmagrittrパッケージの関数であった。新しい|>という演算子はRにネイティブで入っているため、パッケージをロードしなくても使える。少し前のコードだと未だに%>%と書いてあるかもしれないが基本的に同じ意味である(阿部はまだ癖で書いてしまう時がある)。

x1 <- c(1,2,3,4,5)

## 以下の2つは同じことを行っている。
mean(x1)

x1 |> mean() ## |> はパイプと呼ばれるもの

6.5 tidyでないデータとtidyデータの変換

学科
経済学科 533 172
経営学科 478 229
金融学科 398 122

今から横型(wide型)のデータを縦長(long型)に変換する。上のようなデータを下のようなデータに変換したいとする。

学科 性別 人数
経済学科 533
経済学科 172
経営学科 478
経営学科 229
金融学科 398
金融学科 122

6.5.1 long型データへの変換

tidyrというパッケージのpivot_longerという関数はtidyでないデータ(wide型)をtidyなデータ(long型)に変換する。

まずパイプ(|>)でdata_634というwide型のデータをpivot_longer()関数に引き渡す。

pivot_longer() 関数には、まず以下の3つの引数が重要である。

  • colsは、どの列(column)の変数を使うかを指定する
  • names_toは、新たに生成されるカテゴリ用の列の名前を指定する
  • values_toは、数値が入る列の名前を指定する

さらに複雑な操作をする場合は他にも引数を使うことがあるが、基本的な変換は上の三つできちんと指定されていればうまくいくはずだ。

data_634_long <- data_634 |> 
  ## long型に変換。1年〜4年の列(cols)を学生数という列にvalues_toでまとめる。各行に何年生かnames_toで記録する。
  pivot_longer(
    cols=c("1年","2年","3年","4年"),
    names_to ="学年",
    values_to = "学生数") 

6.5.2 データを見てみる

右上のEnvironmentペーンにdata_634_longというオブジェクトが生成される。 クリックしてみると、エクセルのような画面が現れる

またView()という関数をつかっても、同じようにデータを見ることができる。

## data_634_longを見るビューワーがRstudio上で開く
View(data_634_long)

6.5.3 データを一部だけみたい場合

また、データの最初だけみたいときは、head(), また後ろだけ見たいときはtail()関数を使う。 デフォルトでは、6行だけ表示されるが、行数は引数nで調整できる。

## data1の最初の10行がコンソールに表示される
head(data_634_long, n=10)
## # A tibble: 10 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 男    1年      133
##  2 経済学科 男    2年      139
##  3 経済学科 男    3年      121
##  4 経済学科 男    4年      140
##  5 経済学科 女    1年       38
##  6 経済学科 女    2年       50
##  7 経済学科 女    3年       46
##  8 経済学科 女    4年       38
##  9 経営学科 男    1年      129
## 10 経営学科 男    2年      121

6.6 データの「大きさ」

データの行数や列数を調べるときにはdim()関数を使う。

dim(data_634_long)
## [1] 24  4

24行、4列だとわかる。 RStudioではdata.frameオブジェクトは右上ペーンにも表示されている。

6.7 列の名前一覧

データの各変数名(列名)の一覧を見たい場合はnames()colnames()

names(data_634_long)
## [1] "学科"   "性別"   "学年"   "学生数"

6.8 変数の要約

含まれている変数の基本統計量を見たい場合はsummary()関数を使う。

summary(data_634_long)
##        学科   性別     学年       学生数     
##  経済学科:8   男:12   1年:6   Min.   : 24.0  
##  経営学科:8   女:12   2年:6   1st Qu.: 44.0  
##  金融学科:8           3年:6   Median : 76.0  
##                       4年:6   Mean   : 80.5  
##                               3rd Qu.:118.0  
##                               Max.   :140.0
  • 定性的なデータ(カテゴリ変数)は、入っているカテゴリとその数
    • もしcharacterと表示されていたら、単なる文字列と認識されている
  • 定量的なデータは以下のような統計量が計算される。
Min. nth Qu. Median Mean Max.
最小 n分位 中央値 平均 最大

6.9 変数の取り出し

データから変数を一つ取り出すときは$マークを使う。

## データフレーム$変数 で変数の列をベクトルとして取り出す
 data_634_long$学年
##  [1] 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年 1年 2年 3年 4年
## [21] 1年 2年 3年 4年
## Levels: 1年 2年 3年 4年

6.10 変数の取り出しと計算

## 平均 mean()関数
mean(data_634_long$学生数)
## [1] 80.5
## 中央値 median()関数
median(data_634_long$学生数)
## [1] 76
## 分散 var()関数
var(data_634_long$学生数)
## [1] 1625.478
## 合計 sum()関数
sum(data_634_long$学生数)
## [1] 1932

6.11 データの操作

データを編集したいことはたくさん出てくる。

  • 列の名前を変えたい
  • データの特定の列だけ抽出したい
  • データの特定の行だけ提出したい
    • 例:男性だけのデータ
  • データの順番を並び替えたい
  • データの列を並び替えたい
  • 新しい変数を作りたい
  • データを集計したい

6.11.1 データの操作

tidyverseシリーズであるdplyrパッケージに入っている関数で操作することができる。

6.11.2 元のデータの見た目確認

print(data_634_long)
## # A tibble: 24 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 男    1年      133
##  2 経済学科 男    2年      139
##  3 経済学科 男    3年      121
##  4 経済学科 男    4年      140
##  5 経済学科 女    1年       38
##  6 経済学科 女    2年       50
##  7 経済学科 女    3年       46
##  8 経済学科 女    4年       38
##  9 経営学科 男    1年      129
## 10 経営学科 男    2年      121
## # ℹ 14 more rows

6.11.3 列の名前を変えたい: rename()

列(変数)の名前を変更する

data_634_long_eng <- data_634_long |>
  rename(department = 学科, 
         grade = 学年,
         gender = 性別,
         stu_num = 学生数)

print(data_634_long_eng)
## # A tibble: 24 × 4
##    department gender grade stu_num
##    <fct>      <fct>  <fct>   <dbl>
##  1 経済学科   男     1年       133
##  2 経済学科   男     2年       139
##  3 経済学科   男     3年       121
##  4 経済学科   男     4年       140
##  5 経済学科   女     1年        38
##  6 経済学科   女     2年        50
##  7 経済学科   女     3年        46
##  8 経済学科   女     4年        38
##  9 経営学科   男     1年       129
## 10 経営学科   男     2年       121
## # ℹ 14 more rows

6.11.4 特定の列だけ抽出する: select()

データのうち、学科と性別という変数だけ抽出したいとする

data_634_long_select <- data_634_long |> 
  select(学科, 性別)

print(data_634_long_select)
## # A tibble: 24 × 2
##    学科     性別 
##    <fct>    <fct>
##  1 経済学科 男   
##  2 経済学科 男   
##  3 経済学科 男   
##  4 経済学科 男   
##  5 経済学科 女   
##  6 経済学科 女   
##  7 経済学科 女   
##  8 経済学科 女   
##  9 経営学科 男   
## 10 経営学科 男   
## # ℹ 14 more rows

6.11.5 特定の行だけ抽出する: filter()

データのうち、女性のデータだけを抽出したいとする

data_634_long_filter <- data_634_long |> 
  filter(性別 == "女")

print(data_634_long_filter)
## # A tibble: 12 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 女    1年       38
##  2 経済学科 女    2年       50
##  3 経済学科 女    3年       46
##  4 経済学科 女    4年       38
##  5 経営学科 女    1年       62
##  6 経営学科 女    2年       53
##  7 経営学科 女    3年       62
##  8 経営学科 女    4年       52
##  9 金融学科 女    1年       36
## 10 金融学科 女    2年       29
## 11 金融学科 女    3年       33
## 12 金融学科 女    4年       24

6.11.6 データの順番を並び替える: arrange()

データの順番を学年->性別の順番で並び替える

data_634_long_arrange <- data_634_long |> 
  arrange(学年, 性別)

print(data_634_long_arrange)
## # A tibble: 24 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 男    1年      133
##  2 経営学科 男    1年      129
##  3 金融学科 男    1年       93
##  4 経済学科 女    1年       38
##  5 経営学科 女    1年       62
##  6 金融学科 女    1年       36
##  7 経済学科 男    2年      139
##  8 経営学科 男    2年      121
##  9 金融学科 男    2年       90
## 10 経済学科 女    2年       50
## # ℹ 14 more rows

6.11.6.1 降順の並びにする

デフォルトは昇順だが、desc()で降順で並び変えることもできる

data_634_long_arrange2 <- data_634_long |> 
  arrange(desc(学年), 性別)

print(data_634_long_arrange2)
## # A tibble: 24 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 男    4年      140
##  2 経営学科 男    4年      117
##  3 金融学科 男    4年      108
##  4 経済学科 女    4年       38
##  5 経営学科 女    4年       52
##  6 金融学科 女    4年       24
##  7 経済学科 男    3年      121
##  8 経営学科 男    3年      111
##  9 金融学科 男    3年      107
## 10 経済学科 女    3年       46
## # ℹ 14 more rows

6.11.7 データの列を並び替える: relocate()

学年の列を性別の前に持ってくる

data_634_long_relocate <- data_634_long |> 
  relocate(学年, .before=性別)

print(data_634_long_relocate)
## # A tibble: 24 × 4
##    学科     学年  性別  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 1年   男       133
##  2 経済学科 2年   男       139
##  3 経済学科 3年   男       121
##  4 経済学科 4年   男       140
##  5 経済学科 1年   女        38
##  6 経済学科 2年   女        50
##  7 経済学科 3年   女        46
##  8 経済学科 4年   女        38
##  9 経営学科 1年   男       129
## 10 経営学科 2年   男       121
## # ℹ 14 more rows

6.11.7.1 列の後ろに持ってくる場合

学年の列を学科の後に持ってくる

data_634_long_relocate2 <- data_634_long |> 
  relocate(学年, .after=学科)

print(data_634_long_relocate2)
## # A tibble: 24 × 4
##    学科     学年  性別  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 1年   男       133
##  2 経済学科 2年   男       139
##  3 経済学科 3年   男       121
##  4 経済学科 4年   男       140
##  5 経済学科 1年   女        38
##  6 経済学科 2年   女        50
##  7 経済学科 3年   女        46
##  8 経済学科 4年   女        38
##  9 経営学科 1年   男       129
## 10 経営学科 2年   男       121
## # ℹ 14 more rows

6.11.8 データの列を追加する: mutate()

新しく、学生数を100で割った数値を作るとする

data_634_long_mutate <- data_634_long |> 
  mutate(学生数100 = 学生数/100)

print(data_634_long_mutate)
## # A tibble: 24 × 5
##    学科     性別  学年  学生数 学生数100
##    <fct>    <fct> <fct>  <dbl>     <dbl>
##  1 経済学科 男    1年      133      1.33
##  2 経済学科 男    2年      139      1.39
##  3 経済学科 男    3年      121      1.21
##  4 経済学科 男    4年      140      1.4 
##  5 経済学科 女    1年       38      0.38
##  6 経済学科 女    2年       50      0.5 
##  7 経済学科 女    3年       46      0.46
##  8 経済学科 女    4年       38      0.38
##  9 経営学科 男    1年      129      1.29
## 10 経営学科 男    2年      121      1.21
## # ℹ 14 more rows

6.11.9 データの列を編集する: mutate()

存在する変数名にすると、新しく変数(列)を作らずに上書きする

data_634_long_mutate2 <- data_634_long |> 
  mutate(学生数 = 学生数/100)

print(data_634_long_mutate2)
## # A tibble: 24 × 4
##    学科     性別  学年  学生数
##    <fct>    <fct> <fct>  <dbl>
##  1 経済学科 男    1年     1.33
##  2 経済学科 男    2年     1.39
##  3 経済学科 男    3年     1.21
##  4 経済学科 男    4年     1.4 
##  5 経済学科 女    1年     0.38
##  6 経済学科 女    2年     0.5 
##  7 経済学科 女    3年     0.46
##  8 経済学科 女    4年     0.38
##  9 経営学科 男    1年     1.29
## 10 経営学科 男    2年     1.21
## # ℹ 14 more rows

6.11.10 データを集計する

任意を列を集計したり統計量を計算する。

data_634_long_summarise <- data_634_long |> 
  summarise(学生数合計 = sum(学生数),
            学生数平均 = mean(学生数))

print(data_634_long_summarise)
## # A tibble: 1 × 2
##   学生数合計 学生数平均
##        <dbl>      <dbl>
## 1       1932       80.5

6.11.11 データ操作の応用:パイプによる引き渡し

ある操作を行った結果をパイプで次の関数に引き渡す。

## 女性の合計だけを知りたい
data_634_long_female <- data_634_long |>
  filter(性別=="女") |>
  summarise(女性学生数合計 = sum(学生数))

print(data_634_long_female)
## # A tibble: 1 × 1
##   女性学生数合計
##            <dbl>
## 1            523

6.11.12 データ操作の応用:グループごとの集計

グループごとに集計したい場合はgroup_byでグループ情報を与える

## 学科ごとに合計を計算
data_634_long_dept <- data_634_long |>
  group_by(学科) |>
  summarise(学生数合計 = sum(学生数))

print(data_634_long_dept)
## # A tibble: 3 × 2
##   学科     学生数合計
##   <fct>         <dbl>
## 1 経済学科        705
## 2 経営学科        707
## 3 金融学科        520

6.12 練習問題: データ操作

  1. 武蔵大学経済学部の学生数データを使って、女性のみの合計学生数を学年別で計算せよ。結果をdata_634_long_female_gradeというオブジェクトに格納し、結果をコンソールに表示せよ。

  2. 同じデータを使って、1,2年生のみ合計学生数を男女別・学年別で計算せよ。結果をdata_634_long_1_2_gradeというオブジェクトに格納し、結果をコンソールに表示せよ。

6.13 データの結合

2つのデータフレームを結合したい場合

  1. 縦に結合したい場合
  2. 横に結合したい場合

6.13.1 データの縦の結合

例えば人文学部のデータと結合したいとする。 人文学部のデータはこちらからダウンロードできる。

## エクセルからデータを読み込み
data_634_jinbun <- readxl::read_excel("docs/data/musashi_jinbun_students_2023.xlsx") 

knitr::kable(data_634_jinbun) ## kableは見やすい表を出力する関数
学科 性別 4年 3年 2年 1年
英語英米文化学科 53 73 65 51
英語英米文化学科 74 72 77 55
ヨーロッパ文化学科 43 47 37 68
ヨーロッパ文化学科 60 66 63 56
日本・東アジア文化学科 50 46 48 45
日本・東アジア文化学科 61 78 75 74

変数の順番などが同じことを確認した上で、bind_rows()を使う

data_634_keizai_jinbun <- bind_rows(data_634,data_634_jinbun)

print(data_634_keizai_jinbun)
## # A tibble: 12 × 6
##    学科                   性別  `4年` `3年` `2年` `1年`
##    <chr>                  <chr> <dbl> <dbl> <dbl> <dbl>
##  1 経済学科               男      140   121   139   133
##  2 経済学科               女       38    46    50    38
##  3 経営学科               男      117   111   121   129
##  4 経営学科               女       52    62    53    62
##  5 金融学科               男      108   107    90    93
##  6 金融学科               女       24    33    29    36
##  7 英語英米文化学科       男       53    73    65    51
##  8 英語英米文化学科       女       74    72    77    55
##  9 ヨーロッパ文化学科     男       43    47    37    68
## 10 ヨーロッパ文化学科     女       60    66    63    56
## 11 日本・東アジア文化学科 男       50    46    48    45
## 12 日本・東アジア文化学科 女       61    78    75    74

6.13.2 データを横に統合

新しい変数を含んだデータを既存のデータに統合したい

## エクセルからデータを読み込み
data_634_keizai_teiin <- readxl::read_excel("docs/data/musashi_keizai_teiin_2023.xlsx") 

knitr::kable(data_634_keizai_teiin) ## kableは見やすい表を出力する関数
学科 定員
経済学科 580
経営学科 580
金融学科 440

6.13.3 データを横に統合:join()関数

ここではleft_joinを使う。学科という変数をキーとして、左側に存在するすべての行にデータを統合する。

## 学科の人数と学科の定員を統合する
data_634_long_keizai <- data_634_long |>
  left_join(data_634_keizai_teiin, by=c("学科"="学科"))

print(data_634_long_keizai)
## # A tibble: 24 × 5
##    学科     性別  学年  学生数  定員
##    <chr>    <fct> <fct>  <dbl> <dbl>
##  1 経済学科 男    1年      133   580
##  2 経済学科 男    2年      139   580
##  3 経済学科 男    3年      121   580
##  4 経済学科 男    4年      140   580
##  5 経済学科 女    1年       38   580
##  6 経済学科 女    2年       50   580
##  7 経済学科 女    3年       46   580
##  8 経済学科 女    4年       38   580
##  9 経営学科 男    1年      129   580
## 10 経営学科 男    2年      121   580
## # ℹ 14 more rows

6.13.4 join関数一覧

上で使用したleft_join以外にもいくつかのjoin関数が用意されている。

関数名 説明
inner_join() どちらのデータフレームにも存在するキーの行のみ返す
left_join() 左のデータフレームに存在するキーの行を返す
right_join() 右のデータフレームにも存在するキーの行を返す
full_join() いずれかのデータフレームに存在するキーの行を返す