井出草平の研究ノート

SPSS、SAS、StataのデータをRでインポート、エクスポートをする

SPSSSAS、StataのデータをRでインポート、エクスポートをするhavenパッケージの紹介である。 havenパッケージはtidyverseを構成するパッケージの一つである。
他の統計パッケージのデータを読み込む有名なパッケージはforeignだが、RStudioブログによると以下の3点で改善があるらしい。

  1. バイナリSAS7BDATファイルを読み取ることができる。
  2. Stata13ファイルを読み取ることができる。
  3. 常にデータフレームを返す。

https://blog.rstudio.com/2015/03/04/haven-0-1-0/

僕はSASを使わないので、関係があるのは2と3である。特に3である。
foreignパッケージはデータフレームで返すようにオプションで指定しなければならない。
実際、コードを覚えているわけではないので、毎度毎度、コピペをしていて、相当不便であった。havenパッケージの方が簡単なコードで書けて、覚えきれる形式なので、ありがたい。

なお、havenパッケージは変数ラベル、値ラベルもきっちり読み書きできる。foreignパッケージも同様のことは可能なので、havenパッケージの方がこの点で優秀だとは言えないが、やはり簡便にコードが書けるのはすばらしい。

SPSSデータの読み込み

村瀬洋一さんのサイトからデータを利用させていただこう。

www.asahi-net.or.jp

村瀬さんのサイトから以下のデータを利用する。

  1. ジェンダー意識調査 分析実習用データ(SPSS形式データファイル) 06genren.sav

havenパッケージを使ってRに読み込むのは以下のように行う。

library(haven)
d1 <- read_sav("06genren.sav")

SPSSのデータはエンコード問題がある。
現在はSPSSUTF-8を推奨するメッセージを出すようになったので、UTF-8を使っている人が増えてきていると思うのだが、少し昔のファイルでは、ローカルエンコード(Shift-JIS)で作られていることが多かった。
分析をSPSSで完結させている場合には、特に問題がないのだが、Rでインポートとなってくると、文字化けが起こるのである。

f:id:iDES:20191217153649p:plain

このような場合はエンコードcp932にする。

d2 <- read_sav("06genren.sav", encoding ="cp932")

f:id:iDES:20191217153703p:plain

文字化けせずに読み込むことができる。 ちなみにCP932はShift_JISWindowsアプリケーションにおける実装である。 エンコードUTF-8の時は"UTF-8"と書く。

SPSSデータの書き出しとエンコードの変換

さきほど読み込んだd2に格納した06genren.savSPSS形式で書き出す。

write_sav(d2, "gender_survey.sav")

write_sav関数での書き出しはUTF-8である。 Rのhavenパッケージを通すと、SPSSを使わずにデータのエンコードができる。

これはPSPPを使う場合に有用かもしれない。 PSPPも日本語WindowsのローカルエンコードであるCP932に対応していたようにも思うが、WindowsUTF-8で動かしている人は、Shift-JISのSPSSデータを読むと文字化けしたはずなので、そういった場合に、havenパッケージでエンコーディングをするとよいと思う。

Stataデータの読み込み

foreignパッケージではStata13ファイル以降が読み込めないらしい。 Stata16のサンプルデータを読み込んでみよう。

https://www.stata-press.com/data/r16/r.html

d3 <- read_dta("http://www.stata-press.com/data/r16/apple.dta")

以上にように記するとWeb上のデータも取得できる。
read_dtaread_stataでもよいらしい。

Stataデータの書き出し

write_dta(d3, "apple.dta", version=14)

こちらはwrite_stataは通らない。

バージョンは8~15までをサポートしているらしい。
古いStataしか持っていなくて、データが自分の持っているStataのバージョンより大きいバージョンで作成されている場合には、古いバージョンへのデータのダウングレードが可能である。

さきほどSPSSデータ06genren.savをd2で取り込んだが、これをStata形式で出力してみよう。

write_dta(d2, "gender_survey.dta")

Stata16の新規機能実装のウリの一つはSPSSのデータなども読み込めるようなったことである。
いまさらの対応か、とも思うが、ケチくさいのは、書き出しにはいまだに対応していないことである。

僕はStataユーザーになってから日が浅いので、対応するパッケージが作られていて、実はできるというオチのような気もするが、少なくとも標準機能だけではできないので、不便である。
他の統計パッケージのデータが読めない場合には、このような変換テクニックを知っておくと役に立つように思う。