# パッケージの呼び出し
pacman::p_load(
here,
readr, # csvファイルを読み込む.tidyverseとしてもよい.
haven # sav, dta, sasファイルなどを読み込む.
)3 データの読み込み
データの読み込みを行う際にreadrとhavenパッケージを用いる. readrパッケージのかわりにtidyverseパッケージを呼び出してもよい.
3.1 使用するデータ
東京大学社会科学研究所附属社会調査・データアーカイブ研究センター(the Center for Social Research and Data Archives: CSRDA)で公開されている「東大社研・若年パネル調査(JLPS-Y)wave1,2007(非制限公開疑似データ)」(調査番号:u001,寄託者:東京大学社会科学研究所パネル調査プロジェクト)を用いる.
3.2 データの保存先
R4SS:作業ディレクトリdata:データを保存するフォルダprocessed:加工したデータを保存するフォルダraw:加工前の生データを保存するフォルダu001_readme.docxu001.csv:csv形式のデータu001.dta:dta形式のデータ(Stata)u001.sav:sav形式のデータ(SPSS)u001c.pdf:調査票
scripts:Rスクリプトを保存するフォルダ
MACの画面だと Figure 3.1 のようになる.Rの基礎でhere()関数とdir_create()関数を組み合わせて作成している.ここのrawというフォルダにu001.zipを展開した中身を保存する.u001というフォルダは使用しない(使用してもよいがファイルの場所を間違えないようにすること.本資料では,rawのすぐ下にデータがあるように設定している).

3.3 Import Datasetからデータを読み込む
hereをつかったり,ファイルのパスを書くことに慣れないうちは,自分でファイルを探して指定する方法が確実かもしれない. まずcsvの場合は,「File」\(\rightarrow\)「Import Dataset」\(\rightarrow\)「From text (base)…」か「File」\(\rightarrow\)「Import Dataset」\(\rightarrow\)「From text (readr)…」を使用する.
3.3.1 From text (base)…の場合
u001.csvを指定し「Open」を選択すると, Figure 3.2 のような画面が現れる.「Heading」は「Yes」とする.

右下の「Data Frame」に正しくデータが表示されているようであれば,「Import」を選択する. するとデータがソース画面に表示される.うまく読み込まれていそうであればデータは閉じてしまおう. コンソールには読み込みに用いたコードが残されているので,これをコピーしておこう.
u001 <- read.csv("~/GitHub/R4SS/data/raw/u001.csv")3.3.2 From text (readr)…の場合
右端の「Browse」からu001.csvを指定し「Open」を選択すると, Figure 3.3 のような画面が現れる.

そのまま「Import」を選択すればよい.ここでもデータがソースの別のタブで開かれるが,不要なので確認したら閉じてしまおう.コンソールには次のプログラムが残っているので,スクリプトにコピーしておこう.
library(readr)
u001 <- read_csv("data/raw/u001.csv")Rows: 1000 Columns: 72
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
dbl (72): caseid, sex, ybirth, mbirth, ZQ03, JC_1, JC_41, ZQ08A, ZQ08B, ZQ08...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
なおデフォルトではデータを代入するオブジェクトの名前はu001となっているが,コピーしたらdなど適当な分かりやすい名前に変更するとよい.
3.4 csvの場合
では直接パスを書き,データを読み込んでみる.
3.5 read.csv
# read.csvでcsvデータを読み込む
d_csv_1 <- read.csv("data/raw/u001.csv")
# 確認
head(d_csv_1) caseid sex ybirth mbirth ZQ03 JC_1 JC_41 ZQ08A ZQ08B ZQ08C ZQ08D ZQ08E ZQ08F
1 10001 1 1976 10 1 2 12 4 1 3 4 4 4
2 10002 1 1972 1 1 2 9 6 2 2 4 6 6
3 10003 1 1975 4 1 2 9 6 6 6 3 6 6
4 10004 2 1974 11 1 2 7 6 1 1 5 1 1
5 10005 1 1978 1 2 10 88 6 2 2 4 1 2
6 10006 1 1984 2 2 10 88 6 1 2 6 3 6
ZQ08G ZQ08H ZQ11_A ZQ11_B ZQ11_C ZQ11_D ZQ11_E ZQ11_F ZQ11_G ZQ11_H ZQ11_I
1 5 3 2 2 2 2 2 2 2 2 2
2 6 5 2 2 2 2 2 1 2 2 2
3 4 6 2 2 2 2 1 1 1 2 2
4 4 2 2 2 2 2 2 2 2 2 2
5 5 1 2 2 2 2 1 2 2 2 2
6 6 6 2 2 2 2 2 2 2 2 2
ZQ11_J ZQ11_K ZQ11_L ZQ11_M ZQ11_N ZQ11_O ZQ12 ZQ14_1A ZQ14_1B ZQ14_1C
1 2 2 2 2 2 2 2 0 0 1
2 2 2 2 2 2 2 2 0 0 0
3 2 2 2 2 2 2 4 0 0 0
4 2 2 2 2 2 2 3 1 1 0
5 1 2 1 2 2 2 4 2 0 0
6 1 2 2 2 1 2 2 0 0 1
ZQ14_1D ZQ23A ZQ23B ZQ23C ZQ23D ZQ24 ZQ25 ZQ26A ZQ26B ZQ26C ZQ26D ZQ26E ZQ26F
1 0 5 5 5 4 1 1 4 5 3 5 3 4
2 1 3 5 2 2 1 3 5 5 2 5 1 5
3 0 3 2 2 2 1 3 5 5 4 5 3 5
4 0 3 5 2 2 1 2 3 5 2 4 2 4
5 0 5 8 5 5 1 2 3 3 4 3 3 4
6 0 4 8 3 2 1 4 3 4 3 4 3 5
ZQ30D ZQ35 ZQ39A ZQ42 ZQ43 ZQ47A ZQ47B ZQ47C ZQ50 ZQ52A ZQ52Y ZQ54A ZQ54B
1 2 4 4 9 2 6 5 8 2 2 51 1 2
2 1 5 3 1 1 9 5 10 2 2 51 1 2
3 1 4 5 9 4 6 3 6 2 2 56 3 5
4 2 5 3 3 3 6 8 9 2 2 48 6 1
5 4 5 4 2 2 1 99 99 1 8 888 8 8
6 4 7 4 2 3 2 15 10 1 8 888 8 8
ZQ54C ZQ54D ZQ61_A ZQ61_B ZQ61_C ZQ61_D ZQ61_E ZQ61_F ZQ61_G ZQ61_H ZQ61_I
1 9 9 1 2 2 2 2 2 2 2 2
2 2 4 1 2 2 2 2 2 2 2 2
3 3 2 1 2 2 2 2 2 2 2 2
4 5 4 1 2 2 2 2 2 2 2 2
5 8 8 2 2 2 1 2 2 2 2 2
6 8 8 1 2 2 2 2 2 2 2 2
ZQ62
1 3
2 2
3 2
4 4
5 1
6 2
# データのクラス
class(d_csv_1)[1] "data.frame"
hereを使用すれば次のように書ける.
d_csv_1 <- read.csv(here("data","raw","u001.csv"))3.5.1 read_csv
# read_csvでcsvデータを読み込む
d_csv_2 <- read_csv("data/raw/u001.csv")Rows: 1000 Columns: 72
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
dbl (72): caseid, sex, ybirth, mbirth, ZQ03, JC_1, JC_41, ZQ08A, ZQ08B, ZQ08...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 確認
head(d_csv_2)# A tibble: 6 × 72
caseid sex ybirth mbirth ZQ03 JC_1 JC_41 ZQ08A ZQ08B ZQ08C ZQ08D ZQ08E
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 10001 1 1976 10 1 2 12 4 1 3 4 4
2 10002 1 1972 1 1 2 9 6 2 2 4 6
3 10003 1 1975 4 1 2 9 6 6 6 3 6
4 10004 2 1974 11 1 2 7 6 1 1 5 1
5 10005 1 1978 1 2 10 88 6 2 2 4 1
6 10006 1 1984 2 2 10 88 6 1 2 6 3
# ℹ 60 more variables: ZQ08F <dbl>, ZQ08G <dbl>, ZQ08H <dbl>, ZQ11_A <dbl>,
# ZQ11_B <dbl>, ZQ11_C <dbl>, ZQ11_D <dbl>, ZQ11_E <dbl>, ZQ11_F <dbl>,
# ZQ11_G <dbl>, ZQ11_H <dbl>, ZQ11_I <dbl>, ZQ11_J <dbl>, ZQ11_K <dbl>,
# ZQ11_L <dbl>, ZQ11_M <dbl>, ZQ11_N <dbl>, ZQ11_O <dbl>, ZQ12 <dbl>,
# ZQ14_1A <dbl>, ZQ14_1B <dbl>, ZQ14_1C <dbl>, ZQ14_1D <dbl>, ZQ23A <dbl>,
# ZQ23B <dbl>, ZQ23C <dbl>, ZQ23D <dbl>, ZQ24 <dbl>, ZQ25 <dbl>, ZQ26A <dbl>,
# ZQ26B <dbl>, ZQ26C <dbl>, ZQ26D <dbl>, ZQ26E <dbl>, ZQ26F <dbl>, …
# データのクラス
class(d_csv_2)[1] "spec_tbl_df" "tbl_df" "tbl" "data.frame"
hereを使用すれば次のように書ける.
d_csv_2 <- read_csv(here("data","raw","u001.csv"))Rows: 1000 Columns: 72
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
dbl (72): caseid, sex, ybirth, mbirth, ZQ03, JC_1, JC_41, ZQ08A, ZQ08B, ZQ08...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
3.6 dta (Stata) の場合
# read_dtaでdtaデータを読み込む
d_dta <- read_dta("data/raw/u001.dta")
# 確認
head(d_dta)# A tibble: 6 × 72
caseid sex ybirth mbirth ZQ03 JC_1 JC_41 ZQ08A ZQ08B ZQ08C
<dbl> <dbl+l> <dbl> <dbl> <dbl+l> <dbl+lb> <dbl+lb> <dbl+l> <dbl+l> <dbl+l>
1 10001 1 [mal… 1976 10 1 [し… 2 [正… 12 … 4 [週… 1 [毎… 3 [週…
2 10002 1 [mal… 1972 1 1 [し… 2 [正… 9 … 6 [ほ… 2 [週… 2 [週…
3 10003 1 [mal… 1975 4 1 [し… 2 [正… 9 … 6 [ほ… 6 [ほ… 6 [ほ…
4 10004 2 [fem… 1974 11 1 [し… 2 [正… 7 … 6 [ほ… 1 [毎… 1 [毎…
5 10005 1 [mal… 1978 1 2 [し… 10 [無… 88 [非… 6 [ほ… 2 [週… 2 [週…
6 10006 1 [mal… 1984 2 2 [し… 10 [無… 88 [非… 6 [ほ… 1 [毎… 2 [週…
# ℹ 62 more variables: ZQ08D <dbl+lbl>, ZQ08E <dbl+lbl>, ZQ08F <dbl+lbl>,
# ZQ08G <dbl+lbl>, ZQ08H <dbl+lbl>, ZQ11_A <dbl+lbl>, ZQ11_B <dbl+lbl>,
# ZQ11_C <dbl+lbl>, ZQ11_D <dbl+lbl>, ZQ11_E <dbl+lbl>, ZQ11_F <dbl+lbl>,
# ZQ11_G <dbl+lbl>, ZQ11_H <dbl+lbl>, ZQ11_I <dbl+lbl>, ZQ11_J <dbl+lbl>,
# ZQ11_K <dbl+lbl>, ZQ11_L <dbl+lbl>, ZQ11_M <dbl+lbl>, ZQ11_N <dbl+lbl>,
# ZQ11_O <dbl+lbl>, ZQ12 <dbl+lbl>, ZQ14_1A <dbl+lbl>, ZQ14_1B <dbl+lbl>,
# ZQ14_1C <dbl+lbl>, ZQ14_1D <dbl+lbl>, ZQ23A <dbl+lbl>, ZQ23B <dbl+lbl>, …
# データのクラス
class(d_dta)[1] "tbl_df" "tbl" "data.frame"
Stataのファイルに含まれているラベルの情報も読み込まれる.hereを使用すれば次のように書ける.
d_dta <- read_dta(here("data","raw","u001.dta"))3.7 sav (SPSS) の場合
# read_savでsavデータを読み込む
d_sav <- read_sav("data/raw/u001.sav")
# 確認
head(d_sav)# A tibble: 6 × 72
caseid sex ybirth mbirth ZQ03 JC_1 JC_41 ZQ08A ZQ08B ZQ08C
<dbl> <dbl+l> <dbl> <dbl> <dbl+l> <dbl+lb> <dbl+lb> <dbl+l> <dbl+l> <dbl+l>
1 10001 1 [mal… 1976 10 1 [し… 2 [正… 12 … 4 [週… 1 [毎… 3 [週…
2 10002 1 [mal… 1972 1 1 [し… 2 [正… 9 … 6 [ほ… 2 [週… 2 [週…
3 10003 1 [mal… 1975 4 1 [し… 2 [正… 9 … 6 [ほ… 6 [ほ… 6 [ほ…
4 10004 2 [fem… 1974 11 1 [し… 2 [正… 7 … 6 [ほ… 1 [毎… 1 [毎…
5 10005 1 [mal… 1978 1 2 [し… 10 [無… 88 [非… 6 [ほ… 2 [週… 2 [週…
6 10006 1 [mal… 1984 2 2 [し… 10 [無… 88 [非… 6 [ほ… 1 [毎… 2 [週…
# ℹ 62 more variables: ZQ08D <dbl+lbl>, ZQ08E <dbl+lbl>, ZQ08F <dbl+lbl>,
# ZQ08G <dbl+lbl>, ZQ08H <dbl+lbl>, ZQ11_A <dbl+lbl>, ZQ11_B <dbl+lbl>,
# ZQ11_C <dbl+lbl>, ZQ11_D <dbl+lbl>, ZQ11_E <dbl+lbl>, ZQ11_F <dbl+lbl>,
# ZQ11_G <dbl+lbl>, ZQ11_H <dbl+lbl>, ZQ11_I <dbl+lbl>, ZQ11_J <dbl+lbl>,
# ZQ11_K <dbl+lbl>, ZQ11_L <dbl+lbl>, ZQ11_M <dbl+lbl>, ZQ11_N <dbl+lbl>,
# ZQ11_O <dbl+lbl>, ZQ12 <dbl+lbl>, ZQ14_1A <dbl+lbl>, ZQ14_1B <dbl+lbl>,
# ZQ14_1C <dbl+lbl>, ZQ14_1D <dbl+lbl>, ZQ23A <dbl+lbl>, ZQ23B <dbl+lbl>, …
# データのクラス
class(d_sav)[1] "tbl_df" "tbl" "data.frame"
Stataと同様にSPSSのファイルに含まれているラベルの情報も読み込まれる. hereを使用すれば次のように書ける.
d_sav <- read_sav(here("data","raw","u001.sav"))3.8 ラベルを取り除きたい
ラベルを取り除きたい場合は,zap_label()関数やzap_labels()関数を用いる.
zap_label():変数ラベルを取り除くzap_labels():値ラベルを取り除く
以下では,d_savにzap_label()関数とzap_labels()関数を適用し,変数ラベルと値ラベルを取り除き,d_sav_nolabという新しいオブジェクトとして保存している.
d_sav_nolab <- d_sav |> zap_label() |> zap_labels()
d_sav_nolab# A tibble: 1,000 × 72
caseid sex ybirth mbirth ZQ03 JC_1 JC_41 ZQ08A ZQ08B ZQ08C ZQ08D ZQ08E
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 10001 1 1976 10 1 2 12 4 1 3 4 4
2 10002 1 1972 1 1 2 9 6 2 2 4 6
3 10003 1 1975 4 1 2 9 6 6 6 3 6
4 10004 2 1974 11 1 2 7 6 1 1 5 1
5 10005 1 1978 1 2 10 88 6 2 2 4 1
6 10006 1 1984 2 2 10 88 6 1 2 6 3
7 10007 2 1976 6 1 2 8 6 4 1 5 1
8 10008 1 1975 4 1 2 9 5 2 2 4 4
9 10009 2 1985 9 1 3 5 1 1 1 4 1
10 10010 1 1972 2 1 2 8 6 1 2 5 6
# ℹ 990 more rows
# ℹ 60 more variables: ZQ08F <dbl>, ZQ08G <dbl>, ZQ08H <dbl>, ZQ11_A <dbl>,
# ZQ11_B <dbl>, ZQ11_C <dbl>, ZQ11_D <dbl>, ZQ11_E <dbl>, ZQ11_F <dbl>,
# ZQ11_G <dbl>, ZQ11_H <dbl>, ZQ11_I <dbl>, ZQ11_J <dbl>, ZQ11_K <dbl>,
# ZQ11_L <dbl>, ZQ11_M <dbl>, ZQ11_N <dbl>, ZQ11_O <dbl>, ZQ12 <dbl>,
# ZQ14_1A <dbl>, ZQ14_1B <dbl>, ZQ14_1C <dbl>, ZQ14_1D <dbl>, ZQ23A <dbl>,
# ZQ23B <dbl>, ZQ23C <dbl>, ZQ23D <dbl>, ZQ24 <dbl>, ZQ25 <dbl>, …
3.9 ロングデータの作成
パネルデータで分析を行う場合に,ロング形式のデータにしたほうがよい. pivot_longerを使えば簡単にロング形式のデータが作成できる.
https://r4ds.hadley.nz/data-tidy.html#sec-pivoting を参照.
まずはidと必要な変数zq1,zq5,aq1,aq5を準備する. transmuteで必要があれば変換して,新たな名前を与える.この時変数名__年のようにする._でもよいが,その場合は他の変数に_が含まれていないことを確認する.
library(tidyverse)── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ purrr 1.0.1
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
d_wide <- tibble(
id = 1:10,
zq1 = rnorm(10),
zq5 = rbinom(10, size = 1, prob = .5),
aq1 = rnorm(10),
aq5 = rbinom(10, size = 1, prob = .5)
)
d_wide# A tibble: 10 × 5
id zq1 zq5 aq1 aq5
<int> <dbl> <int> <dbl> <int>
1 1 -0.388 1 -0.632 1
2 2 0.156 0 1.87 0
3 3 2.86 1 -1.34 0
4 4 -0.0466 1 0.437 1
5 5 1.01 0 0.531 1
6 6 -0.609 1 0.0495 1
7 7 -0.483 0 0.727 1
8 8 0.614 0 -0.0605 0
9 9 -0.591 1 -2.04 1
10 10 -1.63 0 -0.850 0
d_wide |>
transmute(id,
y__2007 = zq1,
x__2007 = zq5,
y__2008 = aq1,
x__2008 = aq5) |>
pivot_longer(
cols = y__2007:x__2008,
names_to = c(".value", "year"),
names_sep = "__",
values_drop_na = TRUE
) |>
mutate(year = parse_number(year))# A tibble: 20 × 4
id year y x
<int> <dbl> <dbl> <int>
1 1 2007 -0.388 1
2 1 2008 -0.632 1
3 2 2007 0.156 0
4 2 2008 1.87 0
5 3 2007 2.86 1
6 3 2008 -1.34 0
7 4 2007 -0.0466 1
8 4 2008 0.437 1
9 5 2007 1.01 0
10 5 2008 0.531 1
11 6 2007 -0.609 1
12 6 2008 0.0495 1
13 7 2007 -0.483 0
14 7 2008 0.727 1
15 8 2007 0.614 0
16 8 2008 -0.0605 0
17 9 2007 -0.591 1
18 9 2008 -2.04 1
19 10 2007 -1.63 0
20 10 2008 -0.850 0