3  データの読み込み

データの読み込みを行う際にreadrhavenパッケージを用いる. readrパッケージのかわりにtidyverseパッケージを呼び出してもよい.

# パッケージの呼び出し
pacman::p_load(
  here,
  readr,   # csvファイルを読み込む.tidyverseとしてもよい.
  haven   # sav, dta, sasファイルなどを読み込む.
  )

3.1 使用するデータ

東京大学社会科学研究所附属社会調査・データアーカイブ研究センター(the Center for Social Research and Data Archives: CSRDA)で公開されている「東大社研・若年パネル調査(JLPS-Y)wave1,2007(非制限公開疑似データ)」(調査番号:u001,寄託者:東京大学社会科学研究所パネル調査プロジェクト)を用いる.

https://csrda.iss.u-tokyo.ac.jp/infrastructure/urd/

3.2 データの保存先

  • R4SS:作業ディレクトリ
    • data:データを保存するフォルダ
      • processed:加工したデータを保存するフォルダ
      • raw:加工前の生データを保存するフォルダ
        • u001_readme.docx
        • u001.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.1: RStudioの画面

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」とする.

図 3.2: From text (base)…の場合

右下の「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 のような画面が現れる.

図 3.3: From text (readr)…の場合

そのまま「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_savzap_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と必要な変数zq1zq5aq1aq5を準備する. 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