79
rlist パッケージ ススメ 2015. 03. 21 Nagoya. R #13 名古屋大学大学院国際開発研究科  D1 田村祐

rlistパッケージのススメ

Embed Size (px)

Citation preview

Page 1: rlistパッケージのススメ

rlistパッケージの

ススメ2015. 03. 21 Nagoya. R #13

名古屋大学大学院国際開発研究科 D1 田村祐

Page 2: rlistパッケージのススメ

内容に入る前に• この発表では,外国語教育研究(風)のデータ分析を例として扱います

Page 3: rlistパッケージのススメ

概要• リスト形式のデータで作業する際に色々便利な関数が多いrlistパッケージのご紹介

Page 4: rlistパッケージのススメ

ソルジャーのしごと

データ収集

データ入力

データ整形・加工

データ分析・図示

質問紙

テスト

PC課題

Page 5: rlistパッケージのススメ

データ収集

データ入力

データ整形・加工

データ分析・図示

Excel打ち込み

マークシート読み込み

ソルジャーのしごと

Page 6: rlistパッケージのススメ

データ収集

データ入力

データ整形・加工

データ分析・図示

並び替え抽出

集計欠損値処理

ソルジャーのしごと

Page 7: rlistパッケージのススメ

データ収集

データ入力

データ整形・加工

データ分析・図示

相関分析

折れ線グラフt検定・分散分析

箱ひげ図

ソルジャーのしごと

Page 8: rlistパッケージのススメ

今日扱うのはここデータ収集

データ入力

データ整形・加工

データ分析・図示

並び替え抽出

集計欠損値処理

Page 9: rlistパッケージのススメ

はじめに• Rではよくデータフレーム形式でデータ処理を行う

• ただし,データフレーム形式では扱いにくいデータもある

• データフレーム形式とリスト形式の違い

Page 10: rlistパッケージのススメ

データフレーム形式とリスト形式の違い

• データフレーム形式

• リスト形式の中の特別な形がデータフレーム形式

• 1列に1変数が格納されていて,各行に1人のデータがある

• これが1つの変数に入っている状態

• ラベルによる操作が可能

• 分析をする際にはデータフレーム形式が便利

Page 11: rlistパッケージのススメ

ID Age TOEIC Abroad

1 24 780 y

2 20 850 n

3 28 750 n

4 48 900 y

変数

ラベル

変数 変数 変数

Page 12: rlistパッケージのススメ

ID Age TOEIC Abroad

1 24 780 y

2 20 850 n

3 28 750 n

4 48 900 y

個人

個人

個人

個人

Page 13: rlistパッケージのススメ

データフレーム形式とリスト形式の違い

• リスト形式

• 再帰的なデータ構造をもつもの

• 異なる構造のデータの集合

• 要素として文字列,数値のほかにベクトル,配列なども入る

Page 14: 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 =ワークショップ・講演

数値 文字列 数値 ベクトル リスト

Page 15: 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 =ワークショップ・講演

数値 文字列 数値 ベクトル リスト

read.tableではあつかえない…!!

Page 16: rlistパッケージのススメ

こういうデータを扱うのにrlistがとても便利

Page 17: rlistパッケージのススメ

リスト形式のデータの扱い

• JSONフォーマットやYAMLフォーマットがリスト形式との相性バツグン

Page 18: rlistパッケージのススメ

[ { "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 “ラベル” : 中身

Page 19: rlistパッケージのススメ

- 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フォーマット

• こちらのほうが読みやすい?

Page 20: rlistパッケージのススメ

※実はexcelに先ほどのような表形式のデータがあってそれをRにlist形式で読み込もうとすると結構たいへん

Page 21: rlistパッケージのススメ

次回予告エクセルに打ち込んだ表形式のデータをlist形式で読み込む方法

Nagoya. R #14にて発表予定

Page 22: rlistパッケージのススメ

q()

Page 23: rlistパッケージのススメ

ではさすがに申し訳ないので

Page 24: rlistパッケージのススメ

rlistでなにができるかを紹介したいと思います

Page 25: 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 =ワークショップ・講演

数値 文字列 数値 配列 リスト

Page 26: rlistパッケージのススメ

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 = 業績

Page 27: rlistパッケージのススメ

中身を見るにはstr()

Page 28: rlistパッケージのススメ

ただdcと打つと見づらい

Page 29: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 30: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 31: rlistパッケージのススメ

マッピング• list.map(リスト名, 要素名)

• リストの中で欲しい要素だけをリスト化

Page 32: rlistパッケージのススメ

マッピング• list.map(dc, sum(as.numeric(cv)))

• 要素名だけじゃなくて,合計の値をリスト化も可

Page 33: rlistパッケージのススメ

マッピング• 通常lapply()関数を使うようなことをもう少し楽にできる

Page 34: rlistパッケージのススメ

マッピング• 結果をベクトル形式で欲しい時はlist.mapv()関数

Page 35: rlistパッケージのススメ

マッピング• 欲しい要素だけ選んで新しいリストを作りたいとき

• list.select(リスト名, 要素名1, 要素名2, …)

Page 36: rlistパッケージのススメ

マッピング• 別に新しいリストにしなくていいから見やすい形でアウトプットしたいならlist.iter()関数

リスト名 要素名

コロンで区切って

要素名

改行いれて

cat()関数は書き出しに使う関数

Page 37: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 38: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 39: rlistパッケージのススメ

フィルタリング• list.filter(リスト名,条件式)

cvのリストの中のr(査読付き論文)が5本以上の人

Page 40: rlistパッケージのススメ

フィルタリング• 要素がリストでそのリスト内の条件を指定するとき

interestsの中にtaskがある人 2つ以上の条件は&でつなぐ

Page 41: rlistパッケージのススメ

フィルタリング• pipeRパッケージを使うと,フィルタリングして,そのリストではなくそのリストの中で欲しい情報をみるときすっきり書ける

Page 42: rlistパッケージのススメ

フィルタリング• pipeRパッケージを使うと,フィルタリングして,そのリストではなくそのリストの中で欲しい情報をみるときすっきり書ける pipeRの呼び出し

「続けてね」というパイプライン演算子

これを使うことで,入れ子構造でわかりにくくなるのを防げる

Page 43: rlistパッケージのススメ

※ここからは基本的にパイプライン演算子を使ったやり方でいきます

Page 44: rlistパッケージのススメ

フィルタリング• 出力結果をdata.frame型で欲しい…

interestsの中にsentence-processingがあってなおかつ査読付き論文が5本以上ある人

名前と年齢だけを選択

list.stack()関数で,data.frame型にする

Page 45: rlistパッケージのススメ

フィルタリング• 別に検索結果全部はいらないよう…というとき

• list.find (条件式,結果表示数)

Page 46: rlistパッケージのススメ

フィルタリング• 検索したあと結果表示にわざわざもう1行書くのめんどくさいよう…というとき

Page 47: rlistパッケージのススメ

フィルタリング• リストから丸ごと外したいとき

• list.remove(リスト名,要素名)

Page 48: rlistパッケージのススメ

フィルタリング• リストから条件に当てはまるものを外したいとき

• list.exclude(リスト名,条件)

Page 49: rlistパッケージのススメ

フィルタリング• 欠損値の処理

• list.clean(リスト名,recursive=T/F)ネストしているリストの要素に対しても処理を行う場合はT,一番上の層だけでいい場合はF

Page 50: rlistパッケージのススメ

フィルタリング• 欠損値の処理

• list.clean(リスト名,recursive=T/F)ネストしているリストの要素に対しても処理を行う場合はT,一番上の層だけでいい場合はF

Page 51: rlistパッケージのススメ

フィルタリング• 欠損値の処理(長さがゼロのベクトルも処理)

• list.clean(リスト名,式,recursive=T/F)

長さがゼロのベクトルも

Page 52: rlistパッケージのススメ

フィルタリング• 欠損値の処理(長さがゼロのベクトルも処理)

• list.clean(リスト名,式,recursive=T/F)

長さがゼロのベクトルも

Page 53: rlistパッケージのススメ

フィルタリング• 欠損値の処理(とにかく全部消したい!)

• list.clean(リスト名,式,recursive=T/F)

どんなNAをも消す

Page 54: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 55: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 56: rlistパッケージのススメ

ソート• 順位を表示(デフォルトは昇順)

• list.order(リスト名,要素名) • list.order(リスト名,-要素名)or • list.order(リスト名, (要素名))で降順

小さい方から,リストの3番目,1番目,2番目の順で並ぶという

こと

Page 57: rlistパッケージのススメ

ソート• ソートしたリストを作る

• list.sort(リスト名,要素名)※パイプライン演算子を使うとこういう書き方になる

Page 58: rlistパッケージのススメ

ソート• もちろん要素内のリストを参照したい場合もOK

• list.sort(リスト名,要素名)※パイプライン演算子を使うとこういう書き方になる

Page 59: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 60: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 61: rlistパッケージのススメ

グループ化• 要素,条件 etc.などでグループ分けする

• list.group(リスト名,条件)結果の出力もリスト形式

Page 62: rlistパッケージのススメ

グループ化• 要素,条件 etc.などでグループ分けする

• グループ分けしたリストをさらにいじいじできる

リストの要素となっている下位リストの名前をベクトル形式で表示

Page 63: rlistパッケージのススメ

グループ化• リスト内のベクトルの要素をすべてみる

• list.cases(リスト名,要素名)

Page 64: rlistパッケージのススメ

グループ化• リスト内のベクトルの要素で場合分けしてグループ化

• list.class(リスト名,要素名)

Page 65: rlistパッケージのススメ

グループ化• リスト内のベクトルの要素で場合分けしてグループ化

• list.groupでやると,各要素ごとにグループ化できない

Page 66: rlistパッケージのススメ

グループ化• リスト内のベクトルの要素で場合分けしてグループ化 • もちろんこれまで同様グループ分けしたリストもいじいじ可

Page 67: rlistパッケージのススメ

グループ化• リストのデータをテーブル形式で出力 • list.table(リスト名,要素1,要素2)

Page 68: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 69: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 70: rlistパッケージのススメ

リストの結合• 別の新しいリスト作ったった

• このリストを既存のリストと結合したいよう…というとき

• list.join(リスト1,リスト2,共通要素)

Page 71: rlistパッケージのススメ
Page 72: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 73: rlistパッケージのススメ

rlistでできること• マッピング

• フィルタリング

• ソート

• グループ化

• リストの結合

• 他にも色々

Page 74: rlistパッケージのススメ

他にも色々• リストの書き出し

• list.save(リスト名,”ファイル名”) • JSON, YAML, RData, RDS形式に対応 • 拡張子の指定をしないとRData形式で保存される

• リストの読み込み • list.load(“ファイル名”)

Page 75: rlistパッケージのススメ

他にも色々• この他にも,検索,比較などができたり,ここで紹介できなかった関数もかなりあります

• ラムダ式も使えます(※ぼくがいまいちわかってない)

Page 76: rlistパッケージのススメ

まとめ• どうしてもテーブル形式では扱いにくいような階層的なデータなどを扱うのにリスト形式が便利

• リスト形式のデータをいじいじするのにrlistパッケージがとっても便利

• マッピング,フィルタリング,グループ分け,リストの結合,情報の更新など,いじいじしたいことが基本的になんでもできる

Page 77: rlistパッケージのススメ

まとめ• 今回の発表で紹介した関数などは,webのrlist tutorialのページに詳しく書かれていますので,そちらをご参照ください

Page 78: rlistパッケージのススメ

参考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

Page 79: rlistパッケージのススメ

rlistパッケージのススメ

contact info

田村 祐名古屋大学大学院国際開発研究科

[email protected]

http://tamurayu.wordpress.com/

• 階層的なデータはリスト形式と相性◎

• ◯◯の中の☓☓と書きたいときは%in%

• %>>%使えばとっても読みやすい

• 問題は,JSONやYAML形式のデータではなく表形式のデータをどうやってリスト形式としてRに読み込むか