• ここで必要な R パッケージ
library(tidyverse)

ここで学ぶこと

・変数を手作りする方法を解説します
・変数をマージしてデータフレームの作り方を説明します
・複数のデータフレームをマージする方法を説明します
・様々な拡張子のデータを RStudio に取り込む方法を紹介します
・データ分析を行う前段階として、基礎的な専門用語の解説をします

ここで解説する専門用語

テキストデータ、バイナリデータ、拡張子、パス、ファイル、フォルダ、Rプロジェクト、Rプロジェクトフォルダ、作業ディレクトリ、欠損値、変数の型、R付属データ、パイプ演算子、変数の型 (class)、AND演算子、OR演算子、%in%演算子、欠損値

  • ここで使う Rパッケージ {tidyverse} をロードする
library(haven)
library(readxl)
library(tidyverse)
  • {tidyverse} には8つのパッケージが含まれている
  • データを読み込むために必要なのは readr

1. データフレーム

1.1 手作りで変数を作る方法

  • 変数は「ベクトル」とも呼ばれる

  • R におけるデータの最小単位

  • 同じデータ型が一つ以上格納されているオブジェクト

  • ベクトルを作る際に重要なこと

  • 「ベクトル内の全ての要素は同じデータ型であること」

  • 学生の id ナンバーを入力し「id」と名前を付ける

id <- c(1,2,3,4,5,6,7,8)
  • 学生の名前を入力し「name」と名前を付ける
name <- c("鈴木", "竹内", "中山", "藤江", "政", "大塚", "大藤", "北田")
  • 学生のテストスコアを入力し「score」と名前を付ける
score <- c(43, 74, 80, 37, 20, 83, 64, 35)

1.2 手作り変数をデータフレームに加える

  • tibble()関数を使うために必要なパッケージをロード
library(tidyverse)
  • tibble() 関数は data.frame() 関数の拡張版
  • data.frame()関数とtibble()関数は厳密には異なるデータ構造
  • しかし、tibble()で作成した表がより汎用性が高い
df1 <- tibble(id, name, score)
df1
# A tibble: 8 × 3
     id name  score
  <dbl> <chr> <dbl>
1     1 鈴木     43
2     2 竹内     74
3     3 中山     80
4     4 藤江     37
5     5 政       20
6     6 大塚     83
7     7 大藤     64
8     8 北田     35

・注:tibble()関数ではなくベースの R コマンド data.frame() を使っても可能

df2 <- data.frame(id, name, score)
df2
  id name score
1  1 鈴木    43
2  2 竹内    74
3  3 中山    80
4  4 藤江    37
5  5   政    20
6  6 大塚    83
7  7 大藤    64
8  8 北田    35

tibble()関数はデータフレームの大きさ(ここでは 8 x 3)と変数のデータ型(ここでは <dbl><chr>)を表示してくれる
tibble()関数を使う方が好ましい
tibble()関数は {tidyverse}パッケージに含まれている

1.3 データフレームに新たな変数を追加する

  • ここで学科 (gakka) という新たな変数を追加する
  • 既存のデータフレーム名前 (df) の後ろにドルマーク $ を付けて変数名 (gakka) を指定する
df1$gakka <- c("法律政治", "法律政治", "法律政治", "法律政治", "法律政治", "経済", "経済", "法律政治")
df1
# A tibble: 8 × 4
     id name  score gakka   
  <dbl> <chr> <dbl> <chr>   
1     1 鈴木     43 法律政治
2     2 竹内     74 法律政治
3     3 中山     80 法律政治
4     4 藤江     37 法律政治
5     5 政       20 法律政治
6     6 大塚     83 経済    
7     7 大藤     64 経済    
8     8 北田     35 法律政治
  • データフレーム df に性別の変数 (gender) を追加する
df1$gender <- c("男", "女", "男", "女", "男", "女", "女", "男")
df1
# A tibble: 8 × 5
     id name  score gakka    gender
  <dbl> <chr> <dbl> <chr>    <chr> 
1     1 鈴木     43 法律政治 男    
2     2 竹内     74 法律政治 女    
3     3 中山     80 法律政治 男    
4     4 藤江     37 法律政治 女    
5     5 政       20 法律政治 男    
6     6 大塚     83 経済     女    
7     7 大藤     64 経済     女    
8     8 北田     35 法律政治 男    

1.4 データフレームのマージ

  • ここではデータフレーム df2 を作る
  • データフレーム df2 には次の2 つの変数が含ませる
    id
    prefecture

学生の id番号を入力し「id」と変数名を付ける

id <- c(1,2,3,4,5,6,7,8)
  • 学生の出身地を入力し「pref」と変数名をつける
pref <- c("北海道", "福島県", "宮古島", "熊本県", "奈良県", "香川県", "福井県", "広島県")
  • idpref をデータフレームに組み込み「df2」 と名前を付ける
df2 <- tibble(id, pref)
df2
# A tibble: 8 × 2
     id pref  
  <dbl> <chr> 
1     1 北海道
2     2 福島県
3     3 宮古島
4     4 熊本県
5     5 奈良県
6     6 香川県
7     7 福井県
8     8 広島県
  • df1df2 に共通する変数である id をよりどころに df1df2 をマージし、M と名前を付ける
M <- merge(df1, df2, by = "id")
M
  id name score    gakka gender   pref
1  1 鈴木    43 法律政治     男 北海道
2  2 竹内    74 法律政治     女 福島県
3  3 中山    80 法律政治     男 宮古島
4  4 藤江    37 法律政治     女 熊本県
5  5   政    20 法律政治     男 奈良県
6  6 大塚    83     経済     女 香川県
7  7 大藤    64     経済     女 福井県
8  8 北田    35 法律政治     男 広島県

2. 基礎知識のまとめ

2.1 ファイルとフォルダ

  • PC のデータは「ファイル」と呼ばれる
  • ファイルを入れておく入れ物を「フォルダ」(もしくは「ディレクトリ」)と呼ぶ
  • 例えば、下のパソコン画面だと

  • 画面左側には 4 つのフォルダ (backdoor, maps, R, RDD) がある
  • R というフォルダの中には 4 つのファイルがある
  • ファイルには様々な拡張子 (.html .Rmd .csv .doc .png .jpg など)がついている
  • フォルダには拡張子がついていない
  • フォルダは「ディレクトリ」とも呼ばれる
  • Rプロジェクトフォルダ = 「作業ディレクトリ」(working directry)

2.2 パス

  • ファイルやフォルダにアクセスする場合、パスと呼ばれるPC上の住所を指定する
  • getwd() = get working directry
    「今自分がどこで仕事しているのかその作業ディレクトリを示せ」というコマンド
  • 例えば、この教材を作成している RStudio 上で getwd() とコマンドを実行してみる

getwd() "/Users/asanomasahiko/Dropbox/statistics/class_materials/R"

  • Mac user なら、このパスの始点は C ドライブではなくて Users
  • Windows User なら、このパスの始点は C ドライブになっているはず

2.3 作業ディレクトリ

右端にある「R」の意味
私は今「R」という名前のRプロジェクトフォルダ(= 作業ディレクトリ) の中で仕事をしているよ
・「R」というのは、今、私がパソコンで作業している「Rプロジェクトフォルダ」の名前
・このフォルダは「Rプロジェクトフォルダ」 「作業ディレクトリ」とも呼ばれる
- setwd() に適当なパスを入力することで、その都度、作業ディレクトリを設定できる

<span =“color:red”style>- しかし、いちいち作業ディレクトリを指定するより、Rプロジェクトを作成するのが効率的

その理由:
R プロジェクトを作成すると、分析に必要な .csv ファイルを読み込んだり、グラフなどの分析結果を保存する時、いちいちパスを指定する必要がないから

2.4「名前」に関する注意

  • パスに日本語や空白があるとうまく行かないことがある
  • ユーザー名やフォルダ名にはファイル名には日本語を使わない
  • ユーザー名やフォルダ名にはファイル名は半角アルファベットを使う
  • ユーザー名やフォルダ名の初めには数字を使わない
    例)× 「2021_grades」=> ○「grades_2021」
  • ユーザー名やフォルダ名には空白を入れない

3. R 付属データの読み取り

  • R や Rパッケージには標準でいくつかのデータセットが備えられている
  • パッケージを読み込むと付属のデータセットも自動的に読み込む
  • data() と入力→実行するとデータセット一覧が表示される(データの一部だけを表示)
data()

  • 例えば、上から 7 つめのstate.x77 の最初の 6 行を確認してみる
head(state.x77)
           Population Income Illiteracy Life Exp Murder HS Grad Frost   Area
Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
California      21198   5114        1.1    71.71   10.3    62.6    20 156361
Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766
  • state.x77 の終わりの 6 行を確認してみる
tail(state.x77)
              Population Income Illiteracy Life Exp Murder HS Grad Frost  Area
Vermont              472   3907        0.6    71.64    5.5    57.1   168  9267
Virginia            4981   4701        1.4    70.08    9.5    47.8    85 39780
Washington          3559   4864        0.6    71.72    4.3    63.5    32 66570
West Virginia       1799   3617        1.4    69.48    6.7    41.6   100 24070
Wisconsin           4589   4468        0.7    72.48    3.0    54.5   149 54464
Wyoming              376   4566        0.6    70.29    6.9    62.9   173 97203
  • 他にも Titanic の客室別・性別・年齢別生存者数など興味深いデータがある
head(Titanic)
, , Age = Child, Survived = No

      Sex
Class  Male Female
  1st     0      0
  2nd     0      0
  3rd    35     17
  Crew    0      0

, , Age = Adult, Survived = No

      Sex
Class  Male Female
  1st   118      4
  2nd   154     13
  3rd   387     89
  Crew  670      3

, , Age = Child, Survived = Yes

      Sex
Class  Male Female
  1st     5      1
  2nd    11     13
  3rd    13     14
  Crew    0      0

, , Age = Adult, Survived = Yes

      Sex
Class  Male Female
  1st    57    140
  2nd    14     80
  3rd    75     76
  Crew  192     20

4. R 付属データ以外の読み取り

データ形式ごとの読み取り

  • PCのデータには「テキストデータ」「バイナリデータ」がある

  • データ形式は拡張子によって判断する

  • テキストデータ: 人間が理解できる文字列のデータ
    .txt ファイル・・・テキスト分析する時に使う
    .tsv ファイル・・・カンマの代わりに「タブ」で区切られている
    .html ファイル・・・ウェブスクレイピング(PC がオンラインの情報を収集)をする際に使う
    .csv ファイル・・・comma-separated values の略(カンマ区切り)
    → RStudio ではこのファイル形式で読み取ることが多い

  • バイナリデータ: PCは理解できるが人間は特定のソフトを使わないと理解できないデータ
    .xls ファイル・・・Excel で使われるファイル
    .xlsx ファイル・・・Excel で使われるファイル(.xlsより新しい)
    .dta ファイル・・・統計ソフト Stata で使われているデータ形式
    .rds ファイル・・・R 専用のデータ形式

  • MS Office Excel ではなく LibreOffice(無料のオフィスソフト)を使う
    その理由:
    →LibreOffice は無料
    →文字エンコードを指定できる → 文字化けを回避できる

  • 日本語を含むデータを使う場合、文字化けを起こす

→解決策:

  • LibreOffice でファイルを開く際にエンコードを UTF-8あるいは CP932 に指定

4.1 .csvファイルの読み込み

  • 衆議院議員総選挙の得票データ hr96-21.csv をダウンロードして読み込んでみる
  • Rプロジェクトフォルダの中に data というフォルダを作成
  • ダウンロードした hr96-21.csv ファイルを data の中に入れる
  • .csvファイルの読み取りには {tidyverse} の中に含まれる read_csv()関数を使う
hr <- read_csv("data/hr96-21.csv", 
               na = ".")  # 欠損値処理のコマンド  
  • もしくは read_csv() 関数を使わず R のベースコマンドである read.csv() を使って読み取ることもできる
hr <- read.csv("data/hr96-21.csv", 
               na = ".")  # 欠損値処理のコマンド    
  • データ数が少ない場合ならどちらの方法でも大きな違いはない
  • しかし、数万、数十万の観測数のデータを読み取る場合には read_csv() 関数を使う方が圧倒的に早い

csv ファイルデータが読み取れない場合

  • 日本の衆議院総選挙の得票データのように、値に日本語が含まれる場合、注意が必要
    → csv ファイルが読み取れないことがある
  • いくつかの原因が考えられるが、ここではエンコーディングが原因となる場合を紹介する
  • 例えば、上のコマンドを実行したときにデータが読み取れないとしよう
  • まず最初にすることは、hr96-21.csv ファイルをエクセルか Libre Office で開いてみることである

EXCEL でファイルを開く場合

  • おそらく次のように文字化けした画面が見えるはずである

  • EXCELの「ファイル」から「名前を付けて保存」を選択
    → 「CSV UTF-8(コンマ区切り)(csv.)」を選んでファイルを保存

  • 値に日本語を含む csv ファイルには次の二種類ある
  1. Shift-JIS の csv ファイル
  2. UTF-8 の csv ファイル
  • R で読み取れるのは UTF-8 の csv ファイルなので、Shift-JIS から UTF-8 にエンコーディングを変更する必要がある
  • 上で「CSV(コンマ区切り)(.csv)」 を選ぶと、Shift-JIS の csv ファイルで保存されてしまい R で読み取ることができなくなる

Libre Office でファイルを開く場合

  • 次の画面で Unicode(UTF-8) を選ぶ

  • それでも hr96-21.csv が読み取れない場合には、日本語を読み取るエンコーディングを指定した次のコマンドを打ち込む
hr <- read_csv("data/hr96-21.csv", 
               na = ".",
               locale = locale(encoding = "cp932"))

文字化けへの対処 ・R で文字化けが生じる原因は文字のロケール(locale)の違い
・世界標準の UTF-8 を使用する macOS/Linux
・日本語表示に独自仕様を使用する Windows

Mac(もしくは Linux)を使っている場合

Windows で作成されたデータを読み込む際に文字化けが生じる
・日本語 Windows で作成されたデータの場合、ロケールが Shift-JIS である可能性が高い
・日本政府や自治体が作成・公開するデータの多くが Shift-JIS

対処法:
read_csv() 関数を使ってデータを読み取る際、次のコマンドのいずれかを追加する

locale = locale(encoding = "Shift_JIS")
locale = locale(encoding = "cp932")

Windows を使っている場合

・日本語 Windows の場合、世界標準ロケールである UTF-8 を正しく認識できない
対処法:
read_csv() 関数を使ってデータを読み取る際、次のコマンドを追加する

locale = locale(encoding = "UTF-8")

*追記:
・2022年内にリリース予定のR 4.2では Windows版Rでも UTF-8 に対応予定
・その場合、Windows で文字化けが生じる場合、上記「Mac(もしくは Linux)を使っている場合 」と同じ手順で対処する

4.2 .xls[x]ファイルの読み込み

  • エクセルファイルのようなバイナリデータを読み込むために必要なパッケージをロードする
  • 詳細は浅野・矢内『Rによる計量政治学』pp.67-68 を参照
library(readxl)
fh <- read_excel("data/FH_Country.xls")

注意:データを読みこんだだけで、即、計量分析ができる訳ではない

  • ここでは .csv ファイルの読み取り方を説明しただけ
  • 実際に使えるデータに整備するためには、前準備として「データクリーニング」が必要

4.3 .dtaファイルの読み込み

  • .dta ファイルもバイナリデータ
  • .dta ファイルを読み込むために必要なパッケージをロード
library(haven)
  • Bruce Russett and John R. Oneal (2001) “Triangulating Peace” のレプリケーションデータ TRIANGLE.DTA を読み込む
triangle <- read_dta("data/TRIANGLE.DTA")
head(triangle)
# A tibble: 6 × 19
  statea stateb  year dependa dependb demauta demautb allies dispute1 logdstab
   <dbl>  <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>    <dbl>    <dbl>
1      2     20  1920  0.0157   0.280      10       9      0        0     5.82
2      2     20  1921  0.0115   0.224      10      10      0        0     5.82
3      2     20  1922  0.0113   0.201      10      10      0        0     5.82
4      2     20  1923  0.0112   0.213      10      10      0        0     5.82
5      2     20  1924  0.0110   0.213      10      10      0        0     5.82
6      2     20  1925  0.0108   0.191      10      10      0        0     5.82
# … with 9 more variables: lcaprat2 <dbl>, smigoabi <dbl>, opena <dbl>,
#   openb <dbl>, minrpwrs <dbl>, noncontg <dbl>, smldmat <dbl>, smldep <dbl>,
#   dyadid <dbl>
  • データセットに含まれる変数一覧を表示
names(triangle)
 [1] "statea"   "stateb"   "year"     "dependa"  "dependb"  "demauta" 
 [7] "demautb"  "allies"   "dispute1" "logdstab" "lcaprat2" "smigoabi"
[13] "opena"    "openb"    "minrpwrs" "noncontg" "smldmat"  "smldep"  
[19] "dyadid"  

データの保存(書き出し)

  • ここで読み込んだデータは .dta ファイル
  • より汎用性の高い .csv ファイルで書き出してみる
write_excel_csv(triangle, "data/triangle.csv")
  • data フォルダに triangle.csv というファイルが作成されていることを確認すること

4.4 .rdsファイルの読み込み

  • R 固有のデータ形式には、RdsRda(RData)がある
  • Rds ファイルは read_rds() で読み込める
  • Rds ファイルは write_rds() で書き出せる
  • 詳細は浅野・矢内『Rによる計量政治学』p.68 を参照

5. {tidyverse}

  • {tidyverse}とはデータサイエンスのために考案されたRパッケージの集合
  • dplyrtidyrreadrggplot2magrittr など数十パッケージで構成
  • {tidyverse} に属するパッケージは(tidy data; 整然データ)を共有する
  • magrittrパッケージではパイプ演算子 (%>%) というとても便利な機能がある  

パイプ演算子 (%>%)

  • ベクトルやデータフレーム、関数などのオブジェクトをパイプ演算子 (%>%)で繋ぐという点が特徴
  • 2021年5月リリースされた R 4.1以降、R 内蔵演算子としてパイプ演算子(|>)が追加
  • パイプ演算子は %>% でも |> でも、どちらを使っても結果はほとんど同じ
  • この補助教材では %>%|> の両方を使っている
  • パイプ演算子は {tidyverse} をインストールすることで導入可能
  • パイプ演算子(%>% もしくは |>) を使う理由
  • より短いコマンドで間違いが少ないため

事例 1

  • 変数 x に関して数値だけの平均値を求める
x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA)

従来のコマンド

print(sum(x, na.rm = TRUE))
[1] 55

{tidyverse} なコマンド

library(tidyverse)
x %>% 
  sum(na.rm = TRUE) %>% 
  print()
[1] 55

事例 2

  • 例えば、df というデータフレームを使って線形回帰分析を行う場合

従来のコマンド

lm(y ~ x1 + x2 + x3, data = df)

{tidyverse} なコマンド

  • 最初の引数が数式(formula型
    → データフレームを lm() に渡すためには、lm() 内に data = . と書く
  • ドット「.」の箇所にパイプ左側のオブジェクト (ここでは df) が入るという意味
df %>% 
  lm(y ~ x1 + x2 + x3, data = .)

dplyr

  • dplyr{tidyverse} パッケージ群のコア・パッケージの一つ
  • 表形式データ (データフレームや tibble)を操作するパッケージ
  • dplyr を使えば、行や列の抽出が簡単
  • {tidyverse} を読み込むと dplyr は自動的に読み込まれる

データの準備 (hr96-21.csv) hr96-21.csv をクリックしてデータをパソコンにダウンロード  

  • RProject フォルダ内に data という名称のフォルダを作成する
  • ダウンロードした hr96-21.csv を手動でRProject フォルダ内にある data フォルダに入れる
  • 選挙データの読み取る
hr <- read_csv("data/hr96-21.csv",
               na = ".")  
  • hr96_21.csv は1996年に衆院選挙に小選挙区が導入されて以来実施された 9 回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017, 2021)の結果のデータ
  • 読み取った選挙データを確認
  • 読み込んだデータを出力してみる
hr
# A tibble: 9,660 × 22
    year pref  ku      kun    wl  rank nocand seito  j_name gender name  previ…¹
   <dbl> <chr> <chr> <dbl> <dbl> <dbl>  <dbl> <chr>  <chr>  <chr>  <chr>   <dbl>
 1  1996 愛知  aichi     1     1     1      7 新進   河村…  male   KAWA…       2
 2  1996 愛知  aichi     1     0     2      7 自民   今枝…  male   IMAE…       2
 3  1996 愛知  aichi     1     0     3      7 民主   佐藤…  male   SATO…       2
 4  1996 愛知  aichi     1     0     4      7 共産   岩中…  female IWAN…       0
 5  1996 愛知  aichi     1     0     5      7 文化…  伊東…  female ITO,…       0
 6  1996 愛知  aichi     1     0     6      7 国民党 山田浩 male   YAMA…       0
 7  1996 愛知  aichi     1     0     7      7 無所   浅野…  male   ASAN…       0
 8  1996 愛知  aichi     2     1     1      8 新進   青木…  male   AOKI…       2
 9  1996 愛知  aichi     2     0     2      8 自民   田辺…  male   TANA…       0
10  1996 愛知  aichi     2     2     3      8 民主   古川…  male   FURU…       0
# … with 9,650 more rows, 10 more variables: age <dbl>, exp <dbl>,
#   status <dbl>, vote <dbl>, voteshare <dbl>, eligible <dbl>, turnout <dbl>,
#   seshu_dummy <dbl>, jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated
#   variable name ¹​previous
  • dim() 関数を使うと hr は9,660行、22列のデータであることが分かる
dim(hr)
[1] 9660   22
  • df1 には 22 個の変数が入っている
変数名 詳細
year 選挙年 (1996-2017)
pref 都道府県名
ku 小選挙区名
kun 小選挙区
rank 当選順位
wl 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選
nocand 立候補者数
seito 候補者の所属政党
j_name 候補者の氏名(日本語)
name 候補者の氏名(ローマ字)
previous これまでの当選回数(当該総選挙結果は含まない)
gender 立候補者の性別: “male”, “female”
age 立候補者の年齢
exp 立候補者が使った選挙費用(総務省届け出)
status 候補者のステータス: 0 = 非現職、1 現職、2 = 元職
vote 得票数
voteshare 得票率 (%)
eligible 小選挙区の有権者数
turnout 小選挙区の投票率 (%)
seshu_dummy 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲)
jiban_seshu 地盤の受け継ぎ元の政治家の氏名と関係
nojiban_seshu 世襲元の政治家の氏名と関係

5.1 列の抽出: select()

  • データフレーム (hr) から特定の列(column)を抽出する際は select()関数を使う

select()関数の使い方:パイプを使わない場合 select(データ, 変数名1, 変数名2,...)

  • select()関数の第一引数はデータフレームのオブジェクト名(この場合は「データ」が該当)
  • 第二引数以降では抽出する列名を記入(この場合は「変数名1」, 「変数名2」,…が該当)

select()関数の使い方: パイプを使う場合 データ %>% select(変数名1, 変数名2,...)

  • 第一引数(この場合「データ」が該当)がデータフレームであるため、パイプ演算子を使うことが可能
  • hr に含まれる 22 の変数名を表示させる
names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • データフレーム (hr) から year, ku, kun, seito, j_name 列だけを抜き出す
hr %>%   # hr から
  select(year, ku, kun, seito, j_name) # year, ku, kun, seito, j_name を抜き出す
# A tibble: 9,660 × 5
    year ku      kun seito          j_name    
   <dbl> <chr> <dbl> <chr>          <chr>     
 1  1996 aichi     1 新進           河村たかし
 2  1996 aichi     1 自民           今枝敬雄  
 3  1996 aichi     1 民主           佐藤泰介  
 4  1996 aichi     1 共産           岩中美保子
 5  1996 aichi     1 文化フォーラム 伊東マサコ
 6  1996 aichi     1 国民党         山田浩    
 7  1996 aichi     1 無所           浅野光雪  
 8  1996 aichi     2 新進           青木宏之  
 9  1996 aichi     2 自民           田辺広雄  
10  1996 aichi     2 民主           古川元久  
# … with 9,650 more rows

列の抽出(変数の位置が連続している場合)

  • 抜き出したい変数の位置が連続している場合
  • :」を使って抜き出すことができる
hr %>%                                        # hr から
  select(c(year:j_name)) # 1 番目の year から 9 番目の j_name まで抜き出す
# A tibble: 9,660 × 9
    year pref  ku      kun    wl  rank nocand seito          j_name    
   <dbl> <chr> <chr> <dbl> <dbl> <dbl>  <dbl> <chr>          <chr>     
 1  1996 愛知  aichi     1     1     1      7 新進           河村たかし
 2  1996 愛知  aichi     1     0     2      7 自民           今枝敬雄  
 3  1996 愛知  aichi     1     0     3      7 民主           佐藤泰介  
 4  1996 愛知  aichi     1     0     4      7 共産           岩中美保子
 5  1996 愛知  aichi     1     0     5      7 文化フォーラム 伊東マサコ
 6  1996 愛知  aichi     1     0     6      7 国民党         山田浩    
 7  1996 愛知  aichi     1     0     7      7 無所           浅野光雪  
 8  1996 愛知  aichi     2     1     1      8 新進           青木宏之  
 9  1996 愛知  aichi     2     0     2      8 自民           田辺広雄  
10  1996 愛知  aichi     2     2     3      8 民主           古川元久  
# … with 9,650 more rows

データの抜き出しで注意すべき点 ・ここでは hr から変数を抽出し一時的に出力しただけ
・試しに hr に含まれる変数をチェックしてみる

names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"

・9 つの変数が抜き出されていない

・抽出したデータを引き続き使うためには、代入演算子(<-)を使って、抽出した結果を別途のオブジェクトとして新たに名前を付けて格納(=保存)する必要がある
hr から 9 つの変数を抽出したものを hr1 という名で作業環境内に格納するためには以下のように入力する

hr1 <- hr %>% # hr から
  select(c(year:j_name)) # 1 番目の year から 9 番目の j_name まで抜き出す
names(hr1)
[1] "year"   "pref"   "ku"     "kun"    "wl"     "rank"   "nocand" "seito" 
[9] "j_name"

・9 つの変数だけが抜き出されていて、hr1 は抽出したデータとして引き続き使うことができる

列の抽出と変数名の変更を同時に行う

  • select()関数のもう一つの特徴は、変数名の「変更」と「抽出」を同時に行えること
  • 抽出する際、新しい変数名 = 既存の変数名と入力する
  • 例えば、hr から year, ku, kun, seito, j_name, vote を抽出し、j_name の変数名を namae に変更したい場合は以下のように入力する
hr %>% 
  select(year, ku, kun, seito, namae = j_name, vote)
# A tibble: 9,660 × 6
    year ku      kun seito          namae       vote
   <dbl> <chr> <dbl> <chr>          <chr>      <dbl>
 1  1996 aichi     1 新進           河村たかし 66876
 2  1996 aichi     1 自民           今枝敬雄   42969
 3  1996 aichi     1 民主           佐藤泰介   33503
 4  1996 aichi     1 共産           岩中美保子 22209
 5  1996 aichi     1 文化フォーラム 伊東マサコ   616
 6  1996 aichi     1 国民党         山田浩       566
 7  1996 aichi     1 無所           浅野光雪     312
 8  1996 aichi     2 新進           青木宏之   56101
 9  1996 aichi     2 自民           田辺広雄   44938
10  1996 aichi     2 民主           古川元久   43804
# … with 9,650 more rows

変数名のみを変更したい場合

  • rename()関数を使う
  • 使い方は select()関数と同じ
  • 例えば、hrkusenkyoku に、seitoparty に変更する場合は次のように入力する
hr %>% 
  rename(senkyoku = ku, party = seito)
# A tibble: 9,660 × 22
    year pref  senkyoku   kun    wl  rank nocand party       j_name gender name 
   <dbl> <chr> <chr>    <dbl> <dbl> <dbl>  <dbl> <chr>       <chr>  <chr>  <chr>
 1  1996 愛知  aichi        1     1     1      7 新進        河村…  male   KAWA…
 2  1996 愛知  aichi        1     0     2      7 自民        今枝…  male   IMAE…
 3  1996 愛知  aichi        1     0     3      7 民主        佐藤…  male   SATO…
 4  1996 愛知  aichi        1     0     4      7 共産        岩中…  female IWAN…
 5  1996 愛知  aichi        1     0     5      7 文化フォー… 伊東…  female ITO,…
 6  1996 愛知  aichi        1     0     6      7 国民党      山田浩 male   YAMA…
 7  1996 愛知  aichi        1     0     7      7 無所        浅野…  male   ASAN…
 8  1996 愛知  aichi        2     1     1      8 新進        青木…  male   AOKI…
 9  1996 愛知  aichi        2     0     2      8 自民        田辺…  male   TANA…
10  1996 愛知  aichi        2     2     3      8 民主        古川…  male   FURU…
# … with 9,650 more rows, and 11 more variables: previous <dbl>, age <dbl>,
#   exp <dbl>, status <dbl>, vote <dbl>, voteshare <dbl>, eligible <dbl>,
#   turnout <dbl>, seshu_dummy <dbl>, jiban_seshu <chr>, nojiban_seshu <chr>

特定の変数だけを選ばない場合

  • 22 の変数の中から 20 個を抽出したい場合は select()内に20の変数名を入れれば良い
  • しかしこれは非効率
  • select()関数は変数名の前に「!」 (推奨)、または「-」を付けることで、特定の列を除外することができる
  • 例えば、hr から yearpref 列だけを除外したければ次のように入力する
hr %>% 
  select(!c(year, pref))
# A tibble: 9,660 × 20
   ku      kun    wl  rank nocand seito       j_name  gender name  previ…¹   age
   <chr> <dbl> <dbl> <dbl>  <dbl> <chr>       <chr>   <chr>  <chr>   <dbl> <dbl>
 1 aichi     1     1     1      7 新進        河村た… male   KAWA…       2    47
 2 aichi     1     0     2      7 自民        今枝敬… male   IMAE…       2    72
 3 aichi     1     0     3      7 民主        佐藤泰… male   SATO…       2    53
 4 aichi     1     0     4      7 共産        岩中美… female IWAN…       0    43
 5 aichi     1     0     5      7 文化フォー… 伊東マ… female ITO,…       0    51
 6 aichi     1     0     6      7 国民党      山田浩  male   YAMA…       0    51
 7 aichi     1     0     7      7 無所        浅野光… male   ASAN…       0    45
 8 aichi     2     1     1      8 新進        青木宏… male   AOKI…       2    51
 9 aichi     2     0     2      8 自民        田辺広… male   TANA…       0    71
10 aichi     2     2     3      8 民主        古川元… male   FURU…       0    30
# … with 9,650 more rows, 9 more variables: exp <dbl>, status <dbl>,
#   vote <dbl>, voteshare <dbl>, eligible <dbl>, turnout <dbl>,
#   seshu_dummy <dbl>, jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated
#   variable name ¹​previous
  • また、2 つ以上の変数を除外する場合、変数名を「c()」や、「:」を使ってまとめて選ばないことができる
  • 例えば、year から nocand までの 7 つの変数は連続しているので、これらをまとめて選ばないことができる
hr %>% 
  select(!c(year:nocand))
# A tibble: 9,660 × 15
   seito  j_name gender name  previ…¹   age     exp status  vote votes…² eligi…³
   <chr>  <chr>  <chr>  <chr>   <dbl> <dbl>   <dbl>  <dbl> <dbl>   <dbl>   <dbl>
 1 新進   河村…  male   KAWA…       2    47  9.83e6      1 66876    40    346774
 2 自民   今枝…  male   IMAE…       2    72  9.31e6      2 42969    25.7  346774
 3 民主   佐藤…  male   SATO…       2    53  9.23e6      1 33503    20.1  346774
 4 共産   岩中…  female IWAN…       0    43  2.18e6      0 22209    13.3  346774
 5 文化…  伊東…  female ITO,…       0    51 NA           0   616     0.4  346774
 6 国民党 山田浩 male   YAMA…       0    51 NA           0   566     0.3  346774
 7 無所   浅野…  male   ASAN…       0    45 NA           0   312     0.2  346774
 8 新進   青木…  male   AOKI…       2    51  1.29e7      1 56101    32.9  338310
 9 自民   田辺…  male   TANA…       0    71  1.65e7      2 44938    26.4  338310
10 民主   古川…  male   FURU…       0    30  1.14e7      0 43804    25.7  338310
# … with 9,650 more rows, 4 more variables: turnout <dbl>, seshu_dummy <dbl>,
#   jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated variable names
#   ¹​previous, ²​voteshare, ³​eligible

特定の文字列で始まる列を選択: starts_with()

names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • 例えば、hr から seshu で終わる列を抽出する場合は
hr %>% 
  select(j_name, ends_with("seshu"))
# A tibble: 9,660 × 3
   j_name     jiban_seshu                    nojiban_seshu
   <chr>      <chr>                          <chr>        
 1 河村たかし <NA>                           <NA>         
 2 今枝敬雄   <NA>                           <NA>         
 3 佐藤泰介   <NA>                           <NA>         
 4 岩中美保子 <NA>                           <NA>         
 5 伊東マサコ <NA>                           <NA>         
 6 山田浩     <NA>                           <NA>         
 7 浅野光雪   <NA>                           <NA>         
 8 青木宏之   <NA>                           <NA>         
 9 田辺広雄   伯父=加藤鐐五郎(衆議院議員) <NA>         
10 古川元久   <NA>                           <NA>         
# … with 9,650 more rows

特定の文字列で終わる列を選択: ends_with()

  • 例えば、hr から ku で始まる列を抽出する場合は
hr %>% 
  select(j_name, starts_with("ku"))
# A tibble: 9,660 × 3
   j_name     ku      kun
   <chr>      <chr> <dbl>
 1 河村たかし aichi     1
 2 今枝敬雄   aichi     1
 3 佐藤泰介   aichi     1
 4 岩中美保子 aichi     1
 5 伊東マサコ aichi     1
 6 山田浩     aichi     1
 7 浅野光雪   aichi     1
 8 青木宏之   aichi     2
 9 田辺広雄   aichi     2
10 古川元久   aichi     2
# … with 9,650 more rows

列の順番を変更して抽出する方法

  • select() 関数は書かれた順番で列を抽出する
names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • 例えば、2 番目(pref)から 10 番目(gender)の一群と 11 番目(name)から 21 番目(nojiban_seshu)の一群を入れ替えたければ次のように入力する
hr1 <- hr %>% 
  select(year, name:nojiban_seshu, pref:gender)

names(hr1)
 [1] "year"          "name"          "previous"      "age"          
 [5] "exp"           "status"        "vote"          "voteshare"    
 [9] "eligible"      "turnout"       "seshu_dummy"   "jiban_seshu"  
[13] "nojiban_seshu" "pref"          "ku"            "kun"          
[17] "wl"            "rank"          "nocand"        "seito"        
[21] "j_name"        "gender"       

列の順番だけを変更する方法: relocate()

  • 変数を抽出せず、順番のみを変更するなら relocate()関数も使える

relocate()関数の使い方

特定の変数の後ろへ移動
データ %>% relocate(移動したい変数名, .after = 変更先)

特定の変数の前へ移動
データ %>% relocate(移動したい変数名, .before = 変更先)

  • ここでは 11 番目(name)から 21 番目(nojiban_seshu)の一群を、year の後ろに移動させたいのだから
hr2 <- hr %>% 
  relocate(name:nojiban_seshu, .after = year)
names(hr2)
 [1] "year"          "name"          "previous"      "age"          
 [5] "exp"           "status"        "vote"          "voteshare"    
 [9] "eligible"      "turnout"       "seshu_dummy"   "jiban_seshu"  
[13] "nojiban_seshu" "pref"          "ku"            "kun"          
[17] "wl"            "rank"          "nocand"        "seito"        
[21] "j_name"        "gender"       

5.2 行の抽出

  • 列の抽出は select() 関数を使う
  • 行の抽出には filter() 関数を使う

filter()関数の使い方 データ %>% filter(条件1, 条件2,...)

  • filter() 関数を使うためには論理演算子(==、>、&など)の理解が必要

  • データ (hr) を使って演習してみる

names(hr)
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"
  • unique() 関数を使って year の値を確認する
unique(hr$year)
[1] 1996 2000 2003 2005 2009 2012 2014 2017 2021

2021年総選挙のデータだけを取り出す

  • 2021年総選挙のデータだけを取り出したければ
hr %>% 
  filter(year == 2021)
# A tibble: 857 × 22
    year pref  ku      kun    wl  rank nocand seito j_name  gender name  previ…¹
   <dbl> <chr> <chr> <dbl> <dbl> <dbl>  <dbl> <chr> <chr>   <chr>  <chr>   <dbl>
 1  2021 愛知  aichi     1     1     1      3 自民  熊田裕… male   KUMA…       3
 2  2021 愛知  aichi     1     2     2      3 立憲  吉田統… male   YOSH…       2
 3  2021 愛知  aichi     1     0     3      3 N党  門田節… female KADO…       0
 4  2021 愛知  aichi     2     1     1      2 国民  古川元… male   FURU…       8
 5  2021 愛知  aichi     2     2     2      2 自民  中川貴… male   NAKA…       0
 6  2021 愛知  aichi     3     1     1      2 立憲  近藤昭… male   KOND…       8
 7  2021 愛知  aichi     3     2     2      2 自民  池田佳… male   IKED…       3
 8  2021 愛知  aichi     4     1     1      3 自民  工藤彰… male   KUDO…       3
 9  2021 愛知  aichi     4     2     2      3 立憲  牧義夫  male   MAKI…       6
10  2021 愛知  aichi     4     0     3      3 維新  中田千… female NAKA…       0
# … with 847 more rows, 10 more variables: age <dbl>, exp <dbl>, status <dbl>,
#   vote <dbl>, voteshare <dbl>, eligible <dbl>, turnout <dbl>,
#   seshu_dummy <dbl>, jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated
#   variable name ¹​previous

2021年総選挙に出馬した自民党候補者だけを取り出す

  • さらに次の二つの条件を付け加えるとする:
    ・自民党候補者だけ (seito == "自民")
    ・2 番目 (pref) から 19 番目 (turnout) までの変数だけを取り出す

  • filter()関数と select()関数を組み合わせて入力する

  • 取り出した変数には hr2021 というふうにわかりやすい名前を付けるとよい

  • hr に含まれる seito の値をチェックする

unique(hr$seito)
 [1] "新進"                   "自民"                   "民主"                  
 [4] "共産"                   "文化フォーラム"         "国民党"                
 [7] "無所"                   "自由連合"               "政事公団太平会"        
[10] "新社会"                 "社民"                   "新党さきがけ"          
[13] "沖縄社会大衆党"         "市民新党にいがた"       "緑の党"                
[16] "さわやか神戸・市民の会" "民主改革連合"           "青年自由"              
[19] "日本新進"               "公明"                   "諸派"                  
[22] "保守"                   "無所属の会"             "自由"                  
[25] "改革クラブ"             "保守新"                 "ニューディールの会"    
[28] "新党尊命"               "世界経済共同体党"       "新党日本"              
[31] "国民新党"               "新党大地"               "幸福"                  
[34] "みんな"                 "改革"                   "日本未来"              
[37] "日本維新の会"           "当たり前"               "政治団体代表"          
[40] "安楽死党"               "アイヌ民族党"           "次世"                  
[43] "維新"                   "生活"                   "立憲"                  
[46] "希望"                   "緒派"                   ""                      
[49] "N党"                   "国民"                   "れい"                  
  • 2021年総選挙に出馬した自民党候補者だけを取り出す
hr2021 <- hr %>% 
  filter(year == 2021) %>% 
  filter(seito == "自民") %>% 
  select(pref:gender)
  • 取り出したデータを DTパッケージを使って見やすく表示できる
DT::datatable(hr2021)

filter()関数を使う際の注意点

select() 関数と filter() 関数を一緒に使う時の順番に注意

・例えば、次のように入力すると・・・

hr2021 <- hr %>% 
  select(pref:gender) %>% 
  filter(year == 2021) %>% 
  filter(seito == "自民") 
  • 次のようなエラーがでる
    Error in filter():
    ! Problem while computing ..1 = year == 2021.
    Caused by error:
    ! object year not found

  • つまり「year という変数がみつからない!」という意味

  • year が見つからないのは当然
    → 2 行目の select(pref:turnout)year を除外しているから

② 変数の class(型)に注意

  • 指定する変数が数値型 (double, numeric, integer)なら数値を入力
  • 指定する変数が文字型 (character)なら "" で値を囲む

filter(year == 2021)・・・変数が数値型の場合
filter(seito == "自民")・・・変数が文字型の場合

2 つの条件を同時に満たす行を取り出す  

  • AND 演算子(&)もしくは(,)を使う
  • 例えば、hr から次の条件を同時に満たす行を抽出してみる
    ・条件 1: 2021年総選挙に出馬した候補者 (year == 2009)
    ・条件 2: 女性の候補者 (gender == "female")
hr %>% 
  filter(year == 2021 & gender == "female") %>% 
  select(pref, kun, seito, j_name, gender, rank, wl) # 表示する変数を 7 つだけ選択
# A tibble: 140 × 7
   pref    kun seito j_name     gender  rank    wl
   <chr> <dbl> <chr> <chr>      <chr>  <dbl> <dbl>
 1 愛知      1 N党  門田節代   female     3     0
 2 愛知      4 維新  中田千代   female     3     0
 3 愛知      5 維新  岬麻紀     female     3     2
 4 愛知      7 共産  須山初美   female     3     0
 5 愛知     10 れい  安井美沙子 female     4     0
 6 愛媛      2 国民  石井智恵   female     2     0
 7 茨城      4 維新  武藤優子   female     2     0
 8 茨城      4 共産  大内久美子 female     3     0
 9 茨城      5 共産  飯田美弥子 female     3     0
10 茨城      6 自民  国光文乃   female     1     1
# … with 130 more rows
  • 2021年総選挙における女性の候補者は 130 人

2 つの条件のいずれかを満たす行を取り出す  

  • OR 演算子(|)を使う
  • 例えば、hr から 2021年総選挙だけのデータを取り出し
  • 次の条件のいずれか一つを満たす行を抽出してみる
    ・条件 1: 2021年総選挙に出馬した立憲民主党候補者 (seito == "立憲")
    ・条件 1: 2021年総選挙に出馬した社民党候補者 (seito == "社民")
hr %>% 
  filter(year == 2021) %>%                        # 2021年総選挙だけのデータを取り出す
  filter(seito  == "立憲" | seito == "社民") %>%  # 立憲もしくは社民の候補者  
  select(pref, kun, seito, j_name, gender, rank, wl) # 表示する変数を 7 つだけ選択
# A tibble: 223 × 7
   pref    kun seito j_name   gender  rank    wl
   <chr> <dbl> <chr> <chr>    <chr>  <dbl> <dbl>
 1 愛知      1 立憲  吉田統彦 male       2     2
 2 愛知      3 立憲  近藤昭一 male       1     1
 3 愛知      4 立憲  牧義夫   male       2     2
 4 愛知      5 立憲  西川厚志 male       2     0
 5 愛知      6 立憲  松田功   male       2     0
 6 愛知      7 立憲  森本和義 male       2     0
 7 愛知      8 立憲  伴野豊   male       2     2
 8 愛知      9 立憲  岡本充功 male       2     0
 9 愛知     10 立憲  藤原規真 male       3     0
10 愛知     12 立憲  重徳和彦 male       1     1
# … with 213 more rows
  • 2021年総選挙での立憲と社民党の女性候補者は 213 人

OR 演算子AND 演算子の組み合わせ  

  • 例えば、hr から 2021年総選挙だけのデータを取り出し
  • 次の条件 1 か条件 2 のいずれか一つを満たし、かつ条件 3 を満たす行を抽出してみる
    ・条件 1: 2021年総選挙に出馬した社民党候補者 (seito == "立憲")
    ・条件 1: 2021年総選挙に出馬したみんなの党候補者 (seito == "社民")
    ・条件 3: 小選挙区当選者 (wl == 1)
hr %>% 
  filter(year == 2021) %>%                          # 2021年総選挙だけのデータを取り出す
  filter(seito  == "立憲" | seito == "社民") %>% 
  filter(wl == 1) %>% 
  select(pref, kun, seito, j_name, gender, rank, wl) # 表示する変数を 7 つだけ選
# A tibble: 58 × 7
   pref    kun seito j_name     gender  rank    wl
   <chr> <dbl> <chr> <chr>      <chr>  <dbl> <dbl>
 1 愛知      3 立憲  近藤昭一   male       1     1
 2 愛知     12 立憲  重徳和彦   male       1     1
 3 愛知     13 立憲  大西健介   male       1     1
 4 沖縄      2 社民  新垣邦男   male       1     1
 5 岩手      1 立憲  階猛       male       1     1
 6 宮崎      1 立憲  渡辺創     male       1     1
 7 宮城      2 立憲  鎌田さゆり female     1     1
 8 宮城      5 立憲  安住淳     male       1     1
 9 広島      6 立憲  佐藤公治   male       1     1
10 香川      1 立憲  小川淳也   male       1     1
# … with 48 more rows
  • 2021年総選挙における社民党とみんなの党の小選挙区当選者は 48 人

%in% 演算子

  • OR 演算子AND 演算子の組み合わせコードを%in% 演算子を使ってさらに効率化できる
hr %>% 
  filter(year == 2021) %>%                          # 2021年総選挙だけのデータを取り出す
  filter(seito %in% c("立憲","社民"), wl == 1) %>% 
  select(pref, kun, seito, j_name, gender, rank, wl) # 表示する変数を 7 つだけ選
# A tibble: 58 × 7
   pref    kun seito j_name     gender  rank    wl
   <chr> <dbl> <chr> <chr>      <chr>  <dbl> <dbl>
 1 愛知      3 立憲  近藤昭一   male       1     1
 2 愛知     12 立憲  重徳和彦   male       1     1
 3 愛知     13 立憲  大西健介   male       1     1
 4 沖縄      2 社民  新垣邦男   male       1     1
 5 岩手      1 立憲  階猛       male       1     1
 6 宮崎      1 立憲  渡辺創     male       1     1
 7 宮城      2 立憲  鎌田さゆり female     1     1
 8 宮城      5 立憲  安住淳     male       1     1
 9 広島      6 立憲  佐藤公治   male       1     1
10 香川      1 立憲  小川淳也   male       1     1
# … with 48 more rows

6. 欠損値

  • データには欠損値が含まれていることが多い
  • R では欠損値を NA と表記する
  • 当面、欠損値を含むケースを除外して分析する
  • 欠損値を含まれている場合、関数が使えないケースも多い
  • 例えば、総選挙で立候補者が使った選挙費用 (exp) には欠損値が含まれている
  • この場合、平均値を計算する mean() 関数はそのまま使えない
mean(hr$exp)
[1] NA

解決策①:

mean() 関数内に na.rm = TRUE を付けて欠損していない値の平均値を計算する
mean(hr$exp, na.rm = TRUE)
[1] 7551393

解決策②:

欠損値が含まれているケースを 予め除外する: drop_na()

hr %>% 
  drop_na(exp) %>% 
  select(year, j_name, exp) 
# A tibble: 6,829 × 3
    year j_name          exp
   <dbl> <chr>         <dbl>
 1  1996 河村たかし  9828097
 2  1996 今枝敬雄    9311555
 3  1996 佐藤泰介    9231284
 4  1996 岩中美保子  2177203
 5  1996 青木宏之   12940178
 6  1996 田辺広雄   16512426
 7  1996 古川元久   11435567
 8  1996 石山淳一    2128510
 9  1996 藤原美智子  3270533
10  1996 吉田幸弘   11245219
# … with 6,819 more rows
  • 欠損値を drop した exp 6829 行を抽出できた

  • exp の平均値を確認する

hr1 <- hr %>% 
  drop_na(exp) %>% 
  select(year, j_name, exp) 
mean(hr1$exp)
[1] 7551393

7. Exercise

Q7.1: 「1.4 データフレームのマージ」を参考にして、次の問題にこたえなさい

  • Q1: 次の変数を含む、皆さんの家族親族(友人でも可)のデータフレーム (df1) を作りなさい(5人程度)
    id: 通し番号 (1…..5)
    name: 拓也、恵子、美智子等々、家族親族(友人)の名前
    age: 年齢
    relationship: あなたとの関係(父、母、兄、姉、弟、妹、友人等々)

  • Q2: 次の変数を含む、皆さんの家族親族分(友人でも可)のデータフレーム (df2) を作りなさい(5人程度)
    ① id: 通し番号 (1…..5)
    ② gender: 性別
    ③ height: 身長

  • Q3: df1df2 に共通する変数である id をよりどころに df1df2 をマージして M1 を作り、表示しなさい

  • Q4: 作成したデータフレーム M1family.csv と名前を付け DT::datatable() 関数を使って表示しなさい

Q7.2: 「5.2 行の抽出」を参考にして、次の問題にこたえなさい

  • 表示する変数は次の 6 つに限ること
  1. year
  2. pref
  3. kun
  4. wl
  5. seito
  6. j_name
  7. voteshare
  • 分析には衆議院選挙データセット ( hr96_21.csv ) を使うこと

  • Q1: 2005年総選挙に出馬して小選挙区で当選した女性の民主党候補者だけを取り出し、DT::datatable() 関数を使ってデータを見やすく表示しなさい

  • Q2: 2009年総選挙に出馬して小選挙区で当選した女性の自民党候補者だけを取り出し、DT::datatable() 関数を使ってデータを見やすく表示しなさい

参考文献
  • Tidy Animated Verbs
  • 宋財泫 (Jaehyun Song)・矢内勇生 (Yuki Yanai)「私たちのR: ベストプラクティスの探究」
  • 宋財泫「ミクロ政治データ分析実習(2022年度)」
  • 土井翔平(北海道大学公共政策大学院)「Rで計量政治学入門」
  • 矢内勇生(高知工科大学)授業一覧
  • 浅野正彦, 矢内勇生.『Rによる計量政治学』オーム社、2018年
  • 浅野正彦, 中村公亮.『初めてのRStudio』オーム社、2018年
  • Winston Chang, R Graphics Cookbook, O’Reilly Media, 2012.
  • Kieran Healy, DATA VISUALIZATION, Princeton, 2019
  • Kosuke Imai, Quantitative Social Science: An Introduction, Princeton University Press, 2017