{haven}パッケージでストレスなくRとSASで分析する
前置き
僕のメイン言語はSASとRなので、この二つを連携させたり行き来したりということがどうしても発生します。*1 そんなわけで、以前SASの中でRを動かす方法を書きました。
SAS/IML StudioでRを使う - データ解析備忘録
SAS/STATでもPROC IMLしてRを使う - データ解析備忘録
SASの中でRからSASにデータを渡す - データ解析備忘録
RでSASファイル(.sas7bdat)を扱う
一方、RでSASファイル(拡張子は.sas7bdat)を読む方法も以下の記事で触れてます。
sas7bdatファイルの作成と各種ソフトでの読み込み - データ解析備忘録
Rでsas.7bdat形式を読むパッケージとして{sas7bdat}、{foreign}、そして神Hadleyの作りし*2{haven}があるわけですが、これまで僕は安定さを理由に*3{sas7bdat}をよく使っていました。ただ、このパッケージは遅い上に読み込みしかできません。
ところが、先日のアップデートで色々変化があったのでそれを書こうと思います。
*1:大規模データだとSASでないとできない場合もあるし、可視化はやっぱりRの方が楽だし綺麗なので。あと形態素解析のようにSASではできないものも意外とある。
*2:tidyverseの関係で、今はHadleyひとりのものではないようです。
*3:{haven}だと読み込めないことが結構あった。
Rでgroup_concatする方法をまとめる
この記事は R Advent Calendar 2016 4 日目の記事です。
group_concat について
MySQL などの 多くの SQL には group_concat
という関数があります。
どういう関数かというと、複数のレコードを一つにまとめるもので、たとえば以下のようなデータを考えます。
### サンプルデータ id <- c(1, 1, 2, 3, 3) name <- c("apple", "orange", "orange", "orange", "apple") df <- data.frame(id, name)
id | name |
---|---|
1 | apple |
1 | orange |
2 | orange |
3 | orange |
3 | apple |
ここから、id 毎にまとめて次のような形にするの SQL の group_concat
関数です。
id | name |
---|---|
1 | apple, orange |
2 | orange |
3 | apple, orange |
MySQL での使い方など、group_concat
そのものについて知りたい方は例えば以下を参照してください。
文字列の処理をやっているとたまに必要がでてくるこの処理ですが、今回はこの group_by
の処理を R で行うことを考えます。
この記事では 4 通りの方法を紹介しますが、最初の3つについては基本的な考え方は同じです。
Emacsのddskkで辞書をGoogle IMEにする
Emacsでは日本語入力にSKKを利用しているのですが、どうもデフォルトの辞書では変換がショボいので、GoogleのIMEを使おうと思います。
何がすごいのか
例えば、「さーばー」と入力すると、自分で辞書登録せずとも
サーバー、Server、server、SERVER
が変換候補として現れたり、 「まほうしょうじょまどかまぎか」のような普通の辞書にはない単語を
魔法少女まどか☆マギカ
といい感じに変換してくれたりします。
(古い例ですが漢字ひらがなカタカナ記号のあるいい例が思いつかなかったので...)
あるいは、「わたしのなまえは」を
私の名前は
のように文節で変換してくれたりします。
続きを読む(Macの)Rでipadic-neologdを使う
前置き
7月のTokyo.Rにて、こんな発表をしました。
MeCabでの顔文字とかの誤解析を前処理ではなく「後処理」で整理する、という内容だったのですが、こんな指摘がありました。
顔文字や機種依存文字を含む文書を形態素解析したいなら、mecab-ipadic-NEologd を試してみるといいかもしれません。 https://t.co/XWBnpREJUy #TokyoR
— Nakatani Shuyo (@shuyo) July 30, 2016
実はipadic-neologdは以前のバイト先で使っていたので知っていたのですが、今回の発表ではすっかり忘れていたのでした(笑)。
ipadic-neologdとは
昨年の3月くらいに登場した、固有名詞や最近の言葉にに強いMeCab用の辞書です。
続きを読む【SAS】アルファベットや飛び飛びの値でもループしたい
SASの繰り返しのマクロである%do
ループでは%do i=1 %to 10
のように、整数値でしかループさせることができません。
今回は、整数以外でもループさせたいときの対処法をまとめてみます。
飛び飛びの値
飛び飛びの値とは、%do i=1 , 2, 3, 5
のように整数が連続していないループのこと。
この対処法については
データステップ100万回 SAS新手一生: マクロの%doループはループ値にリスト形式の離散値は指定できないので、工夫しようの話
にまとまってますが、おそらく最もシンプルで応用が利くのは以下のやり方です。
これを実行すると、A列に1があるというシンプルなデータセットmydata1, mydata2, mydata3, mydata5の4つがWORKライブラリに作成されます。
このコードでは、%let
でループに使う数字をマクロ変数で定義して%scan
で新しくjに代入しています。
なので、ここの%let
さえ変えてやれば文字だろうと数字だろうと自由にループを作成できます。
%sysfunc
は()の中身に関数を指定してそれを実行するマクロです。
アルファベット
例えば、上記と似たような感じでmydataA〜mydataEを作りたいことを考えます。(1~5でいいじゃんというツッコミは受け付けません。)
方法1 上記と同じように代入する
方法2 asciiコードを使う
SAS忘備録: DO i = 'A' to 'Z' ;
で紹介されている方法です。asciiコードとは、コンピュータにおける最も基本的な文字コードで、全部で128割り当てられているのですが、このうち10進数で言うところの65〜90にアルファベットのA〜Zが割り当てられています。そこで、SAS上でasciiコードを呼び出せるbyte()
関数を%sysfunc()
の中に入れて以下のように書きます。