library(tidyverse)
・変数を手作りする方法を解説します
・変数をマージしてデータフレームの作り方を説明します
・複数のデータフレームをマージする方法を説明します
・様々な拡張子のデータを RStudio に取り込む方法を紹介します
・データ分析を行う前段階として、基礎的な専門用語の解説をします
テキストデータ、バイナリデータ、拡張子、パス、ファイル、フォルダ、Rプロジェクト、Rプロジェクトフォルダ、作業ディレクトリ、欠損値、変数の型、R付属データ、パイプ演算子、変数の型
(class
)、AND
演算子、OR
演算子、%in%
演算子、欠損値
{tidyverse}
をロードするlibrary(haven)
library(readxl)
library(tidyverse)
{tidyverse}
には8つのパッケージが含まれているreadr
変数は「ベクトル」とも呼ばれる
R におけるデータの最小単位
同じデータ型が一つ以上格納されているオブジェクト
ベクトルを作る際に重要なこと
「ベクトル内の全ての要素は同じデータ型であること」
学生の id
ナンバーを入力し「id
」と名前を付ける
<- c(1,2,3,4,5,6,7,8) id
name
」と名前を付ける<- c("鈴木", "竹内", "中山", "藤江", "政", "大塚", "大藤", "北田") name
score
」と名前を付ける<- c(43, 74, 80, 37, 20, 83, 64, 35) score
tibble()
関数を使うために必要なパッケージをロードlibrary(tidyverse)
tibble()
関数は data.frame()
関数の拡張版data.frame()
関数とtibble()
関数は厳密には異なるデータ構造tibble()
で作成した表がより汎用性が高い<- tibble(id, name, score)
df1 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()
を使っても可能
<- data.frame(id, name, score)
df2 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}
パッケージに含まれている
gakka
) という新たな変数を追加するdf
) の後ろにドルマーク
$
を付けて変数名 (gakka
) を指定する$gakka <- c("法律政治", "法律政治", "法律政治", "法律政治", "法律政治", "経済", "経済", "法律政治")
df1 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
)
を追加する$gender <- c("男", "女", "男", "女", "男", "女", "女", "男")
df1 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 法律政治 男
df2
を作るdf2
には次の2 つの変数が含ませるid
prefecture
学生の
id
番号を入力し「id
」と変数名を付ける
<- c(1,2,3,4,5,6,7,8) id
pref
」と変数名をつける<- c("北海道", "福島県", "宮古島", "熊本県", "奈良県", "香川県", "福井県", "広島県") pref
id
と pref
をデータフレームに組み込み「df2
」 と名前を付ける<- tibble(id, pref)
df2 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 広島県
df1
と df2
に共通する変数である id
をよりどころに df1
と df2
をマージし、M
と名前を付ける<- merge(df1, df2, by = "id")
M 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 法律政治 男 広島県
.html
.Rmd
.csv
.doc
.png
.jpg
など)がついているgetwd()
= get working directrygetwd()
とコマンドを実行してみるgetwd()
"/Users/asanomasahiko/Dropbox/statistics/class_materials/R"
Mac user
なら、このパスの始点は
C ドライブ
ではなくて Users
Windows User
なら、このパスの始点は
C ドライブ
になっているはず右端にある「R」の意味
私は今「R」という名前のRプロジェクトフォルダ(=
作業ディレクトリ) の中で仕事をしているよ
・「R」というのは、今、私がパソコンで作業している「Rプロジェクトフォルダ」の名前
・このフォルダは「Rプロジェクトフォルダ」
「作業ディレクトリ」とも呼ばれる
- setwd()
に適当なパスを入力することで、その都度、作業ディレクトリを設定できる
<span =“color:red”style>- しかし、いちいち作業ディレクトリを指定するより、Rプロジェクトを作成するのが効率的
その理由:
R プロジェクトを作成すると、分析に必要な .csv
ファイルを読み込んだり、グラフなどの分析結果を保存する時、いちいちパスを指定する必要がないから
2021
_grades」=> ○「grades_2021」data()
と入力→実行するとデータセット一覧が表示される(データの一部だけを表示)data()
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
データ形式ごとの読み取り
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 は無料
→文字エンコードを指定できる → 文字化けを回避できる
日本語を含むデータを使う場合、文字化けを起こす
→解決策:
UTF
-8あるいは CP932
に指定.csv
ファイルの読み込みdata
というフォルダを作成hr96-21.csv
ファイルを
data
の中に入れる.csv
ファイルの読み取りには {tidyverse}
の中に含まれる read_csv()
関数を使う<- read_csv("data/hr96-21.csv",
hr na = ".") # 欠損値処理のコマンド
read_csv()
関数を使わず R
のベースコマンドである read.csv()
を使って読み取ることもできる<- read.csv("data/hr96-21.csv",
hr na = ".") # 欠損値処理のコマンド
read_csv()
関数を使う方が圧倒的に早いhr96-21.csv
ファイルをエクセルか
Libre Office で開いてみることであるCSV UTF-8(コンマ区切り)(csv.)
」を選んでファイルを保存Shift-JIS
の csv ファイルUTF-8
の csv ファイルUTF-8
の csv
ファイルなので、Shift-JIS
から UTF-8
にエンコーディングを変更する必要があるCSV(コンマ区切り)(.csv)
」
を選ぶと、Shift-JIS
の csv ファイルで保存されてしまい R
で読み取ることができなくなるhr96-21.csv
が読み取れない場合には、日本語を読み取るエンコーディングを指定した次のコマンドを打ち込む<- read_csv("data/hr96-21.csv",
hr na = ".",
locale = locale(encoding = "cp932"))
文字化けへの対処 ・R
で文字化けが生じる原因は文字のロケール(locale
)の違い
・世界標準の UTF-8
を使用する
macOS
/Linux
・日本語表示に独自仕様を使用する Windows
・Windows
で作成されたデータを読み込む際に文字化けが生じる
・日本語 Windows
で作成されたデータの場合、ロケールが
Shift-JIS
である可能性が高い
・日本政府や自治体が作成・公開するデータの多くが
Shift-JIS
対処法:
・read_csv()
関数を使ってデータを読み取る際、次のコマンドのいずれかを追加する
locale = locale(encoding = "Shift_JIS")
locale = locale(encoding = "cp932")
・日本語 Windows
の場合、世界標準ロケールである
UTF-8
を正しく認識できない
対処法:
・read_csv()
関数を使ってデータを読み取る際、次のコマンドを追加する
locale = locale(encoding = "UTF-8")
*追記:
・2022年内にリリース予定のR 4.2では Windows版Rでも UTF-8
に対応予定
・その場合、Windows
で文字化けが生じる場合、上記「Mac(もしくは Linux)を使っている場合
」と同じ手順で対処する
.xls[x]
ファイルの読み込みlibrary(readxl)
<- read_excel("data/FH_Country.xls") fh
注意:データを読みこんだだけで、即、計量分析ができる訳ではない
.csv
ファイルの読み取り方を説明しただけ.dta
ファイルの読み込み.dta
ファイルもバイナリデータ.dta
ファイルを読み込むために必要なパッケージをロードlibrary(haven)
<- read_dta("data/TRIANGLE.DTA")
triangle 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
というファイルが作成されていることを確認すること.rds
ファイルの読み込みRds
と
Rda(RData)
があるread_rds()
で読み込めるwrite_rds()
で書き出せる{tidyverse}
{tidyverse}
とはデータサイエンスのために考案されたRパッケージの集合dplyr
、tidyr
、readr
、ggplot2
、magrittr
など数十パッケージで構成{tidyverse}
に属するパッケージは(tidy data
;
整然データ)を共有するmagrittr
パッケージではパイプ演算子
(%>%
) というとても便利な機能がある %>%
)%>%
)で繋ぐという点が特徴R 4.1
以降、R
内蔵演算子としてパイプ演算子(|>
)が追加%>%
でも
|>
でも、どちらを使っても結果はほとんど同じ%>%
と |>
の両方を使っている{tidyverse}
をインストールすることで導入可能%>%
もしくは |>
)
を使う理由<- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA) x
print(sum(x, na.rm = TRUE))
[1] 55
library(tidyverse)
%>%
x sum(na.rm = TRUE) %>%
print()
[1] 55
lm(y ~ x1 + x2 + x3, data = df)
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
フォルダに入れる<- read_csv("data/hr96-21.csv",
hr 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 | 世襲元の政治家の氏名と関係 |
select()
(hr)
から特定の列(column
)を抽出する際は
select()
関数を使うselect()
関数の使い方:パイプを使わない場合
select(データ, 変数名1, 変数名2,...)
select()
関数の第一引数はデータフレームのオブジェクト名(この場合は「データ」が該当)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
という名で作業環境内に格納するためには以下のように入力する
<- hr %>% # hr から
hr1 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()
関数のもう一つの特徴は、変数名の「変更」と「抽出」を同時に行えること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()
関数と同じhr
の ku
を senkyoku
に、seito
を party
に変更する場合は次のように入力する%>%
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>
select()
内に20の変数名を入れれば良いselect()
関数は変数名の前に「!
」
(推奨)、または「-
」を付けることで、特定の列を除外することができるhr
から year
と pref
列だけを除外したければ次のように入力する%>%
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
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"
pref
)から 10
番目(gender
)の一群と 11 番目(name
)から 21
番目(nojiban_seshu
)の一群を入れ替えたければ次のように入力する<- hr %>%
hr1 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 = 変更先)
name
)から 21
番目(nojiban_seshu
)の一群を、year
の後ろに移動させたいのだから<- hr %>%
hr2 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"
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
%>%
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
さらに次の二つの条件を付け加えるとする:
・自民党候補者だけ (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党" "国民" "れい"
<- hr %>%
hr2021 filter(year == 2021) %>%
filter(seito == "自民") %>%
select(pref:gender)
::datatable(hr2021) DT
filter()
関数を使う際の注意点
select()
関数と filter()
関数を一緒に使う時の順番に注意・例えば、次のように入力すると・・・
<- hr %>%
hr2021 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 == "自民")
・・・変数が文字型の場合
&
)もしくは(,
)を使うhr
から次の条件を同時に満たす行を抽出してみるyear == 2009
)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
|
)を使うhr
から
2021年総選挙だけのデータを取り出しseito == "立憲"
)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
OR 演算子
と AND 演算子
の組み合わせ hr
から
2021年総選挙だけのデータを取り出しseito == "立憲"
)seito == "社民"
)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
%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
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
の平均値を確認する
<- hr %>%
hr1 drop_na(exp) %>%
select(year, j_name, exp)
mean(hr1$exp)
[1] 7551393
・Q7.1:
「1.4 データフレームのマージ」
を参考にして、次の問題にこたえなさい
Q1:
次の変数を含む、皆さんの家族親族(友人でも可)のデータフレーム
(df1
) を作りなさい(5人程度)
① id
: 通し番号 (1…..5)
② name
:
拓也、恵子、美智子等々、家族親族(友人)の名前
③ age
: 年齢
④ relationship
:
あなたとの関係(父、母、兄、姉、弟、妹、友人等々)
Q2:
次の変数を含む、皆さんの家族親族分(友人でも可)のデータフレーム
(df2
) を作りなさい(5人程度)
① id: 通し番号 (1…..5)
② gender: 性別
③ height: 身長
Q3: df1
と df2
に共通する変数である id をよりどころに df1
と
df2
をマージして M1
を作り、表示しなさい
Q4: 作成したデータフレーム M1
に
family.csv
と名前を付け DT::datatable()
関数を使って表示しなさい
・Q7.2:
「5.2 行の抽出」
を参考にして、次の問題にこたえなさい
分析には衆議院選挙データセット ( hr96_21.csv ) を使うこと
Q1:
2005年総選挙に出馬して小選挙区で当選した女性の民主党候補者だけを取り出し、DT::datatable()
関数を使ってデータを見やすく表示しなさい
Q2:
2009年総選挙に出馬して小選挙区で当選した女性の自民党候補者だけを取り出し、DT::datatable()
関数を使ってデータを見やすく表示しなさい