Upload
yu-tamura
View
670
Download
2
Embed Size (px)
Citation preview
rlistパッケージの
ススメ2015. 03. 21 Nagoya. R #13
名古屋大学大学院国際開発研究科 D1 田村祐
内容に入る前に• この発表では,外国語教育研究(風)のデータ分析を例として扱います
概要• リスト形式のデータで作業する際に色々便利な関数が多いrlistパッケージのご紹介
ソルジャーのしごと
データ収集
データ入力
データ整形・加工
データ分析・図示
質問紙
テスト
PC課題
データ収集
データ入力
データ整形・加工
データ分析・図示
Excel打ち込み
マークシート読み込み
ソルジャーのしごと
データ収集
データ入力
データ整形・加工
データ分析・図示
並び替え抽出
集計欠損値処理
ソルジャーのしごと
データ収集
データ入力
データ整形・加工
データ分析・図示
相関分析
折れ線グラフt検定・分散分析
箱ひげ図
ソルジャーのしごと
今日扱うのはここデータ収集
データ入力
データ整形・加工
データ分析・図示
並び替え抽出
集計欠損値処理
はじめに• Rではよくデータフレーム形式でデータ処理を行う
• ただし,データフレーム形式では扱いにくいデータもある
• データフレーム形式とリスト形式の違い
データフレーム形式とリスト形式の違い
• データフレーム形式
• リスト形式の中の特別な形がデータフレーム形式
• 1列に1変数が格納されていて,各行に1人のデータがある
• これが1つの変数に入っている状態
• ラベルによる操作が可能
• 分析をする際にはデータフレーム形式が便利
ID Age TOEIC Abroad
1 24 780 y
2 20 850 n
3 28 750 n
4 48 900 y
変数
ラベル
変数 変数 変数
ID Age TOEIC Abroad
1 24 780 y
2 20 850 n
3 28 750 n
4 48 900 y
個人
個人
個人
個人
データフレーム形式とリスト形式の違い
• リスト形式
• 再帰的なデータ構造をもつもの
• 異なる構造のデータの集合
• 要素として文字列,数値のほかにベクトル,配列なども入る
ID Name Age interests paper
1 Junya 26speaking,
task, sentence- processing
r = 8, nr = 5
2 Kuni 28
reading, grammar,
motivation, sentence-processing
r = 12, nr = 11, ws = 6
3 Yusaku 25 CALL, vocabulary r = 3, nr = 1
ラベル
r =査読有り論文,nr =査読なし論文,ws =ワークショップ・講演
数値 文字列 数値 ベクトル リスト
ID Name Age interests paper
1 Junya 26speaking,
task, sentence- processing
r = 8, nr = 5
2 Kuni 28
reading, grammar,
motivation, sentence-processing
r = 12, nr = 11, ws = 6
3 Yusaku 25 CALL, vocabulary r = 3, nr = 1
ラベル
r =査読有り論文,nr =査読なし論文,ws =ワークショップ・講演
数値 文字列 数値 ベクトル リスト
read.tableではあつかえない…!!
こういうデータを扱うのにrlistがとても便利
リスト形式のデータの扱い
• JSONフォーマットやYAMLフォーマットがリスト形式との相性バツグン
[ { "Name" : "Junya", "Age" : 26, "Interests" : [ "speaking", "task", “sentnece-processing" ], "Paper" : { “r": 8, "nr": 5 } }, { "Name" : "Kuni", "Age" : 28, "Interests" : [ "reading", “grammar”, “motivation”, “sentence-processing” ], "Papaer" : { "r" : 12, "nr" : 11, "ws" : 6 } }, { "Name" : "Yusaku", "Age" : 25,
JSONフォーマット
[ ] 配列
{ } リスト
“key” : value “ラベル” : 中身
- Name: Junya Age: 26 Interests: - speaking - task - sentence-processing Paper: r: 8 nr: 5- Name: Kuni Age: 28 Interests: - reading - grammar - motivation - sentence-processing Paper: r: 12 nr: 11 ws: 6- Name: Yusaku Age: 25 Interests: - CALL - vocabulary Paper: r: 3 nr: 1
YAMLフォーマット
• こちらのほうが読みやすい?
※実はexcelに先ほどのような表形式のデータがあってそれをRにlist形式で読み込もうとすると結構たいへん
次回予告エクセルに打ち込んだ表形式のデータをlist形式で読み込む方法
Nagoya. R #14にて発表予定
q()
ではさすがに申し訳ないので
rlistでなにができるかを紹介したいと思います
ID Name Age interests paper
1 Junya 26speaking,
task, sentence- processing
r = 8, nr = 5
2 Kuni 28
reading, grammar,
motivation, sentence-processing
r = 12, nr = 11, ws = 6
3 Yusaku 25 CALL, vocabulary r = 3, nr = 1
ラベル
r =査読有り論文,nr =査読なし論文,ws =ワークショップ・講演
数値 文字列 数値 配列 リスト
dc<- list( p1=list(name="Junya",age=26, interests=c("speaking","task","sentence-processing"), cv=list(r=8,nr=5)), p2=list(name="Kuni",age=28, interests=c("reading","grammar","motivation","sentence-processing"), cv=list(r=12,nr=11,ws=6)), p3=list(name="Yusaku",age=25, interests=c("CALL","vocabulary"), cv=list(r=3,nr=1)))
こんな感じでリストを作ります
name = 名前; age = 年齢; interests = 研究の関心; cv = 業績
中身を見るにはstr()
ただdcと打つと見づらい
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
マッピング• list.map(リスト名, 要素名)
• リストの中で欲しい要素だけをリスト化
マッピング• list.map(dc, sum(as.numeric(cv)))
• 要素名だけじゃなくて,合計の値をリスト化も可
マッピング• 通常lapply()関数を使うようなことをもう少し楽にできる
マッピング• 結果をベクトル形式で欲しい時はlist.mapv()関数
マッピング• 欲しい要素だけ選んで新しいリストを作りたいとき
• list.select(リスト名, 要素名1, 要素名2, …)
マッピング• 別に新しいリストにしなくていいから見やすい形でアウトプットしたいならlist.iter()関数
リスト名 要素名
コロンで区切って
要素名
改行いれて
cat()関数は書き出しに使う関数
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
フィルタリング• list.filter(リスト名,条件式)
cvのリストの中のr(査読付き論文)が5本以上の人
フィルタリング• 要素がリストでそのリスト内の条件を指定するとき
interestsの中にtaskがある人 2つ以上の条件は&でつなぐ
フィルタリング• pipeRパッケージを使うと,フィルタリングして,そのリストではなくそのリストの中で欲しい情報をみるときすっきり書ける
フィルタリング• pipeRパッケージを使うと,フィルタリングして,そのリストではなくそのリストの中で欲しい情報をみるときすっきり書ける pipeRの呼び出し
「続けてね」というパイプライン演算子
これを使うことで,入れ子構造でわかりにくくなるのを防げる
※ここからは基本的にパイプライン演算子を使ったやり方でいきます
フィルタリング• 出力結果をdata.frame型で欲しい…
interestsの中にsentence-processingがあってなおかつ査読付き論文が5本以上ある人
名前と年齢だけを選択
list.stack()関数で,data.frame型にする
フィルタリング• 別に検索結果全部はいらないよう…というとき
• list.find (条件式,結果表示数)
フィルタリング• 検索したあと結果表示にわざわざもう1行書くのめんどくさいよう…というとき
フィルタリング• リストから丸ごと外したいとき
• list.remove(リスト名,要素名)
フィルタリング• リストから条件に当てはまるものを外したいとき
• list.exclude(リスト名,条件)
フィルタリング• 欠損値の処理
• list.clean(リスト名,recursive=T/F)ネストしているリストの要素に対しても処理を行う場合はT,一番上の層だけでいい場合はF
フィルタリング• 欠損値の処理
• list.clean(リスト名,recursive=T/F)ネストしているリストの要素に対しても処理を行う場合はT,一番上の層だけでいい場合はF
フィルタリング• 欠損値の処理(長さがゼロのベクトルも処理)
• list.clean(リスト名,式,recursive=T/F)
長さがゼロのベクトルも
フィルタリング• 欠損値の処理(長さがゼロのベクトルも処理)
• list.clean(リスト名,式,recursive=T/F)
長さがゼロのベクトルも
フィルタリング• 欠損値の処理(とにかく全部消したい!)
• list.clean(リスト名,式,recursive=T/F)
どんなNAをも消す
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
ソート• 順位を表示(デフォルトは昇順)
• list.order(リスト名,要素名) • list.order(リスト名,-要素名)or • list.order(リスト名, (要素名))で降順
小さい方から,リストの3番目,1番目,2番目の順で並ぶという
こと
ソート• ソートしたリストを作る
• list.sort(リスト名,要素名)※パイプライン演算子を使うとこういう書き方になる
ソート• もちろん要素内のリストを参照したい場合もOK
• list.sort(リスト名,要素名)※パイプライン演算子を使うとこういう書き方になる
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
グループ化• 要素,条件 etc.などでグループ分けする
• list.group(リスト名,条件)結果の出力もリスト形式
グループ化• 要素,条件 etc.などでグループ分けする
• グループ分けしたリストをさらにいじいじできる
リストの要素となっている下位リストの名前をベクトル形式で表示
グループ化• リスト内のベクトルの要素をすべてみる
• list.cases(リスト名,要素名)
グループ化• リスト内のベクトルの要素で場合分けしてグループ化
• list.class(リスト名,要素名)
グループ化• リスト内のベクトルの要素で場合分けしてグループ化
• list.groupでやると,各要素ごとにグループ化できない
グループ化• リスト内のベクトルの要素で場合分けしてグループ化 • もちろんこれまで同様グループ分けしたリストもいじいじ可
グループ化• リストのデータをテーブル形式で出力 • list.table(リスト名,要素1,要素2)
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
リストの結合• 別の新しいリスト作ったった
• このリストを既存のリストと結合したいよう…というとき
• list.join(リスト1,リスト2,共通要素)
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
rlistでできること• マッピング
• フィルタリング
• ソート
• グループ化
• リストの結合
• 他にも色々
他にも色々• リストの書き出し
• list.save(リスト名,”ファイル名”) • JSON, YAML, RData, RDS形式に対応 • 拡張子の指定をしないとRData形式で保存される
• リストの読み込み • list.load(“ファイル名”)
他にも色々• この他にも,検索,比較などができたり,ここで紹介できなかった関数もかなりあります
• ラムダ式も使えます(※ぼくがいまいちわかってない)
まとめ• どうしてもテーブル形式では扱いにくいような階層的なデータなどを扱うのにリスト形式が便利
• リスト形式のデータをいじいじするのにrlistパッケージがとっても便利
• マッピング,フィルタリング,グループ分け,リストの結合,情報の更新など,いじいじしたいことが基本的になんでもできる
まとめ• 今回の発表で紹介した関数などは,webのrlist tutorialのページに詳しく書かれていますので,そちらをご参照ください
参考URL• Leihcrev’s memo 入門本編6章 リストとデータフレーム― https://
sites.google.com/site/leihcrev/r/lists-and-data-frames • rlist Tutorial ― http://renkun.me/rlist-tutorial/index.html • rlist Tutorial (日本語訳)― http://renkun.me/rlist/ja/
• R-Source 19. 行列の作成―http://cse.naro.affrc.go.jp/takezawa/r-tips/r/19.html
• R-Source 23.リスト― http://cse.naro.affrc.go.jp/takezawa/r-tips/r/23.html
• R-Source 39.データフレーム事始― http://cse.naro.affrc.go.jp/takezawa/r-tips/r/39.html
• 【超訳】pipeR の使い方 #rstatsj ― http://qiita.com/hoxo_m/items/b80778d46684b818abd2
rlistパッケージのススメ
contact info
田村 祐名古屋大学大学院国際開発研究科
http://tamurayu.wordpress.com/
• 階層的なデータはリスト形式と相性◎
• ◯◯の中の☓☓と書きたいときは%in%
• %>>%使えばとっても読みやすい
• 問題は,JSONやYAML形式のデータではなく表形式のデータをどうやってリスト形式としてRに読み込むか