SPSS、SAS、StataのデータをRでインポート、エクスポートをするhavenパッケージの紹介である。
havenパッケージはtidyverseを構成するパッケージの一つである。
他の統計パッケージのデータを読み込む有名なパッケージはforeignだが、RStudioブログによると以下の3点で改善があるらしい。
- バイナリSAS7BDATファイルを読み取ることができる。
- Stata13ファイルを読み取ることができる。
- 常にデータフレームを返す。
https://blog.rstudio.com/2015/03/04/haven-0-1-0/
僕はSASを使わないので、関係があるのは2と3である。特に3である。
foreignパッケージはデータフレームで返すようにオプションで指定しなければならない。
実際、コードを覚えているわけではないので、毎度毎度、コピペをしていて、相当不便であった。havenパッケージの方が簡単なコードで書けて、覚えきれる形式なので、ありがたい。
なお、havenパッケージは変数ラベル、値ラベルもきっちり読み書きできる。foreignパッケージも同様のことは可能なので、havenパッケージの方がこの点で優秀だとは言えないが、やはり簡便にコードが書けるのはすばらしい。
SPSSデータの読み込み
村瀬洋一さんのサイトからデータを利用させていただこう。
村瀬さんのサイトから以下のデータを利用する。
havenパッケージを使ってRに読み込むのは以下のように行う。
library(haven) d1 <- read_sav("06genren.sav")
SPSSのデータはエンコード問題がある。
現在はSPSSがUTF-8を推奨するメッセージを出すようになったので、UTF-8を使っている人が増えてきていると思うのだが、少し昔のファイルでは、ローカルエンコード(Shift-JIS)で作られていることが多かった。
分析をSPSSで完結させている場合には、特に問題がないのだが、Rでインポートとなってくると、文字化けが起こるのである。
このような場合はエンコードをcp932
にする。
d2 <- read_sav("06genren.sav", encoding ="cp932")
文字化けせずに読み込むことができる。 ちなみにCP932はShift_JISのWindowsアプリケーションにおける実装である。 エンコードがUTF-8の時は"UTF-8"と書く。
SPSSデータの書き出しとエンコードの変換
さきほど読み込んだd2に格納した06genren.sav
をSPSS形式で書き出す。
write_sav(d2, "gender_survey.sav")
write_sav
関数での書き出しはUTF-8である。
Rのhavenパッケージを通すと、SPSSを使わずにデータのエンコードができる。
これはPSPPを使う場合に有用かもしれない。 PSPPも日本語WindowsのローカルエンコードであるCP932に対応していたようにも思うが、WindowsをUTF-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_dta
はread_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ユーザーになってから日が浅いので、対応するパッケージが作られていて、実はできるというオチのような気もするが、少なくとも標準機能だけではできないので、不便である。
他の統計パッケージのデータが読めない場合には、このような変換テクニックを知っておくと役に立つように思う。