便利なパッケージtidyverse

みなさんはtidyverseを使っていますでしょうか?私はデータを扱うときにはとりあえず読み込むくらいtidyverseが好きです。今回はtidyverseで私がよく使う関数と、それを使った派生技を紹介していきたいと思います。さっそくLet’Go!

left_join

left_joinは2つのデータセットをくっつけるときによく使います。innner_joinやraight_joinもありますが、僕はleft_joinしか使いません。キーの指定が面倒なので「左のtableには消えてはいけないデータがあって、右のtableの情報を足すだけ」と考えれば困ったことはないです。

例えば、このようなディズニーランドのアトラクションデータが2つあったとします。

head(attraction_coo)
id ido keido
オムニバス 35.6328665 139.8799643
ペニーアーケード 35.6340014 139.87741
ウエスタンリバー鉄道 35.6337201 139.8801419
カリブの海賊 35.6342728 139.8785159
ジャングルクルーズ:ワイルドライフ・エクスペディション 35.6338175 139.880021
スイスファミリー・ツリーハウス 35.6333234 139.8794404
head(attraction_start)
id start
オムニバス 1983-04-15
ペニーアーケード 1983-04-15
ウエスタンリバー鉄道 1983-04-15
カリブの海賊 1983-04-15
ジャングルクルーズ:ワイルドライフ・エクスペディション 1983-04-15
スイスファミリー・ツリーハウス 1993-07-21

attraction_cooが座標のデータ、atraction_startがアトラクションオープン日のデータです。

この2つをくっつけてみます。

attraction_coo %>% 
  left_join(attraction_start)
## Joining with `by = join_by(id)`
id ido keido start
オムニバス 35.6328665 139.8799643 1983-04-15
ペニーアーケード 35.6340014 139.87741 1983-04-15
ウエスタンリバー鉄道 35.6337201 139.8801419 1983-04-15
カリブの海賊 35.6342728 139.8785159 1983-04-15
ジャングルクルーズ:ワイルドライフ・エクスペディション 35.6338175 139.880021 1983-04-15
スイスファミリー・ツリーハウス 35.6333234 139.8794404 1993-07-21
魅惑のチキルーム:スティッチ・プレゼンツ”アロハ・エ・コモ・マイ!” 35.633111 139.8800858 2008-07-25
ウエスタンランド・シューティングギャラリー 35.6325856 139.8810976 1983-04-15
カントリーベア・シアター 35.6325856 139.8810976 1983-04-15
蒸気船マークトウェイン号 35.6316173 139.8807639 1983-04-15
トムソーヤ島いかだ 35.6319897 139.8815456 1983-04-15
トムソーヤ島 35.6315518 139.8846135 1983-04-15
ビッグサンダー・マウンテン 35.6324726 139.8813379 1987-07-04
スプラッシュ・マウンテン 35.6318279 139.8826562 1992-10-01
ビーバーブラザーズのカヌー探険 35.6310369 139.8817814 1983-04-15
アリスのティーパーティー 35.6311482 139.8787883 1986-03-08
イッツ・ア・スモールワールド 35.6306942 139.8787374 1983-04-15
キャッスルカルーセル 35.6314043 139.8790643 1983-04-15
白雪姫と七人のこびと 35.6316912 139.8791461 1983-04-15
シンデレラのフェアリーテイル・ホール 35.6320581 139.8786619 2011-04-15
空飛ぶダンボ 35.6314679 139.8795044 1983-04-15
ピーターパン空の旅 35.6317622 139.8796473 1983-04-15
ピノキオの冒険旅行 35.6317622 139.8796473 1983-04-15
プーさんのハニーハント 35.6305544 139.8779199 2000-09-01
ホーンテッドマンション 35.6305544 139.8779199 1983-04-15
ミッキーのフィルハーマジック 35.6310663 139.8798985 2011-01-24
ガジェットのゴーコースター 35.6305454 139.8764833 1996-04-15
グーフィーのペイント&プレイハウス 35.6304899 139.8769999 2012-08-24
チップとデールのツリーハウス 35.6304899 139.8769999 1996-04-15
トゥーンパーク 35.6297405 139.8783338 1996-04-15
ドナルドのボート 35.630495 139.8767787 1996-04-15
ミニーの家 35.6300548 139.8767905 1996-04-15
ロジャーラビットのカートゥーンスピン 35.6311262 139.8783647 1996-04-15
スター・ツアーズ:ザ・アドベンチャーズ・コンティニュー 35.6301946 139.87659 2013-05-07
スティッチ・エンカウンター 35.632499 139.8768397 2015-07-17
スペース・マウンテン 35.6323898 139.8755958 1983-04-15
バズ・ライトイヤーのアストロブラスター 35.6323898 139.8755958 2004-04-15
モンスターズ・インク”ライド&ゴーシーク!” 35.6338854 139.8762124 2009-04-15
美女と野獣“魔法のものがたり” 35.6308104 139.8784616 2020-04-15
ベイマックスのハッピーライド 35.6319006757121 139.878872126679 2020-04-15

くっつきましたね。本来はキーと呼ばれるどれとどれがつながるかという情報を与える必要があります。ただ、2つのデータフレームに共通する変数名がある場合は勝手にキーをそれにしてくれます。複数のデータを繋げ合わせて使いたいときに便利です。

select

次はselect関数です。たくさん変数があるデータから必要なデータだけを取ってくるのに使います。ここではディズニーリゾートのアトラクションやレストラン、ショーといったデータを使います。

head(disney_data)
id park area ido keido URL open
9 オムニバス TDL ワールドバザール 35.6328665 139.8799643 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
10 ペニーアーケード TDL ワールドバザール 35.6340014 139.87741 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
11 ウエスタンリバー鉄道 TDL アドベンチャーランド 35.6337201 139.8801419 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
12 カリブの海賊 TDL アドベンチャーランド 35.6342728 139.8785159 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
13 ジャングルクルーズ:ワイルドライフ・エクスペディション TDL アドベンチャーランド 35.6338175 139.880021 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
14 スイスファミリー・ツリーハウス TDL アドベンチャーランド 35.6333234 139.8794404 http://ja.dbpedia.org/resource/アトラクション 1993-07-21
disney_data[80:100,]
id park area ido keido URL open
88 ロイヤルストリート・ベランダ TDL アドベンチャーランド 35.6342488 139.8786632 http://ja.dbpedia.org/resource/フード 1983-04-15
89 カウボーイ・クックハウス TDL ウエスタンランド 35.6320058 139.8805677 http://ja.dbpedia.org/resource/フード 2019-03-15
90 キャンプ・ウッドチャック・キッチン TDL ウエスタンランド 35.6320042 139.8819893 http://ja.dbpedia.org/resource/フード 2016-11-22
91 ザ・ダイヤモンドホースシュー TDL ウエスタンランド 35.6326271 139.8794693 http://ja.dbpedia.org/resource/フード 1983-04-15
92 ハングリーベア・レストラン TDL ウエスタンランド 35.6325693 139.8807229 http://ja.dbpedia.org/resource/フード 1983-04-15
93 プラザパビリオン・レストラン TDL ウエスタンランド 35.6328647 139.8792524 http://ja.dbpedia.org/resource/フード 1983-04-15
94 ペコスビル・カフェ TDL ウエスタンランド 35.6328647 139.8792524 http://ja.dbpedia.org/resource/フード 1983-04-15
95 グランマ・サラのキッチン TDL クリッターカントリー 35.6310842 139.8803631 http://ja.dbpedia.org/resource/フード 1992-10-01
96 ラケッティのラクーンサルーン TDL クリッターカントリー 35.6305146 139.8813675 http://ja.dbpedia.org/resource/フード 1992-10-01
97 キャプテンフックス・ギャレー TDL ファンタジーランド 35.6325697 139.8806157 http://ja.dbpedia.org/resource/フード 1983-04-15
98 クイーン・オブ・ハートのバンケットホール TDL ファンタジーランド 35.6310234 139.8801823 http://ja.dbpedia.org/resource/フード 1998-11-13
99 クレオズ TDL ファンタジーランド 35.6310043 139.8797922 http://ja.dbpedia.org/resource/フード 1996-07-20
100 トルバドールタバン TDL ファンタジーランド 35.6320222 139.8811208 http://ja.dbpedia.org/resource/フード 1983-04-15
101 ビレッジペイストリー TDL ファンタジーランド 35.6309255 139.8795965 http://ja.dbpedia.org/resource/フード 1997-07-31
102 マジカルマーケット TDL ファンタジーランド 35.6325032 139.8798964 http://ja.dbpedia.org/resource/フード 2018-04-27
103 ディンギードリンク TDL トゥーンタウン 35.6315086 139.8756978 http://ja.dbpedia.org/resource/フード 1997-07-18
104 トゥーントーン・トリート TDL トゥーンタウン 35.6304132 139.8782642 http://ja.dbpedia.org/resource/フード 2013-03-18
105 ヒューイ・デューイ・ルーイのグッドタイムカフェ TDL トゥーンタウン 35.6300782 139.8781413 http://ja.dbpedia.org/resource/フード 1996-04-15
106 ミッキーのトレーラー TDL トゥーンタウン 35.6303392 139.8777734 http://ja.dbpedia.org/resource/フード 1996-04-15
107 ソフトランディング TDL トゥモローランド 35.6328594 139.8783802 http://ja.dbpedia.org/resource/フード 1983-04-15
108 トゥモローランド・テラス TDL トゥモローランド 35.6319108 139.8784628 http://ja.dbpedia.org/resource/フード 1983-04-15
tail(disney_data)
id park area ido keido URL open
213 ビッグバンドビート TDS アメリカンウォーターフロント 35.6249106 139.8872273 http://ja.dbpedia.org/resource/ショー 2006-07-14
214 ブロードウェイ・ミュージックシアター TDS アメリカンウォーターフロント 35.6249106 139.8872273 http://ja.dbpedia.org/resource/ショー 2006-07-14
215 マイ・フレンド・ダッフィー TDS アメリカンウォーターフロント 35.6245484 139.8840107 http://ja.dbpedia.org/resource/ショー 2010-03-20
216 ソング・オブ・ミラージュ TDS ロストリバーデルタ 35.625774 139.8814132 http://ja.dbpedia.org/resource/ショー 2019-07-23
217 ハロー、ニューヨーク! TDS アメリカンウォーターフロント 35.6239623 139.8858322 http://ja.dbpedia.org/resource/ショー 2018-07-10
218 ドックサイドステージ TDS アメリカンウォーターフロント 35.6239623 139.8858322 http://ja.dbpedia.org/resource/ショー 2001-09-04

私が使いたいのはidとpark、ido、keido、openの5つの変数なのでこのように指定します。

data <- disney_data %>% 
  select(id, park, ido, keido, open)

head(data)
id park ido keido open
9 オムニバス TDL 35.6328665 139.8799643 1983-04-15
10 ペニーアーケード TDL 35.6340014 139.87741 1983-04-15
11 ウエスタンリバー鉄道 TDL 35.6337201 139.8801419 1983-04-15
12 カリブの海賊 TDL 35.6342728 139.8785159 1983-04-15
13 ジャングルクルーズ:ワイルドライフ・エクスペディション TDL 35.6338175 139.880021 1983-04-15
14 スイスファミリー・ツリーハウス TDL 35.6333234 139.8794404 1993-07-21

できました。でも、5つも指定するのは面倒です。そんなときは「-」を使って次のようにも指定できます。

data <- disney_data %>% 
  select(-area, -URL)

head(data)
id park ido keido open
9 オムニバス TDL 35.6328665 139.8799643 1983-04-15
10 ペニーアーケード TDL 35.6340014 139.87741 1983-04-15
11 ウエスタンリバー鉄道 TDL 35.6337201 139.8801419 1983-04-15
12 カリブの海賊 TDL 35.6342728 139.8785159 1983-04-15
13 ジャングルクルーズ:ワイルドライフ・エクスペディション TDL 35.6338175 139.880021 1983-04-15
14 スイスファミリー・ツリーハウス TDL 35.6333234 139.8794404 1993-07-21

同じ表ができました。さらにselectはstarts_withやends_withを使ってこんなこともできます。

head(
disney_data %>% 
  select(starts_with("i"))
)
id ido
9 オムニバス 35.6328665
10 ペニーアーケード 35.6340014
11 ウエスタンリバー鉄道 35.6337201
12 カリブの海賊 35.6342728
13 ジャングルクルーズ:ワイルドライフ・エクスペディション 35.6338175
14 スイスファミリー・ツリーハウス 35.6333234
head(
disney_data %>% 
  select(ends_with("do"))
)
ido keido
9 35.6328665 139.8799643
10 35.6340014 139.87741
11 35.6337201 139.8801419
12 35.6342728 139.8785159
13 35.6338175 139.880021
14 35.6333234 139.8794404

変数名の先頭が「i」の列を取ったり、末尾が「do」の列を持ってこれます。(この例ではほぼ意味ないけど)意外と知ってると役に立つのでお勧めです。

##filter

filterは行方向で条件を満たす行を取ってくる関数です。とある列の要素が条件を満たすときにその列を持ってくきます。

filter(変数 条件式 要素)のように書きます。

この表からディズニーランドのもののみをを分けるときなどに使います。parkの要素がTDLなのが東京ディズニーランド、TDSなのが東京ディズニーシーです。ランドのものだけを取ってきます。

TDL <- disney_data %>% 
  filter(park == "TDL")

tail(TDL)
id park area ido keido URL open
110 スウィートハート・カフェ前 TDL ワールドバザール 35.633569 139.8786776 http://ja.dbpedia.org/resource/フード NA
111 トレジャーコメット横 TDL トゥモローランド 35.63225 139.878694 http://ja.dbpedia.org/resource/フード NA
112 トゥーンポップ TDL トゥーンタウン 35.6302778 139.8797502 http://ja.dbpedia.org/resource/フード 1996-04-15
113 ポップ・ア・ロット・ポップコーン TDL トゥーンタウン 35.6303035 139.8788917 http://ja.dbpedia.org/resource/フード 2005-11-01
114 プーさんのハニーハント前 TDL ファンタジーランド 35.630944 139.880083 http://ja.dbpedia.org/resource/フード NA
115 ポッピングポッド TDL トゥモローランド 35.6327617 139.8787078 http://ja.dbpedia.org/resource/フード 2004-07-15

これで、ランドのみを取ってこれました。filter(変数名 条件式 要素)のように書くので、filter(park != “TDS”)と書いても同様の結果になります。

次は、アトラクションのみを取ってきたいと思います。しかし、アトラクションかどうかを記してある変数はありません。そこでURL変数の末尾に注目します。

disney_data[49:55, 6]
## [1] "http://ja.dbpedia.org/resource/花火"          
## [2] "http://ja.dbpedia.org/resource/花火"          
## [3] "http://ja.dbpedia.org/resource/ショー"        
## [4] "http://ja.dbpedia.org/resource/ショー"        
## [5] "http://ja.dbpedia.org/resource/パレード"      
## [6] "http://ja.dbpedia.org/resource/グリーティング"
## [7] "http://ja.dbpedia.org/resource/アトラクション"

花火やショー、アトラクションと書いてありますね。この末尾を使って次のように書くとアトラクションのみを取ってこれます。

attraction <- disney_data %>% 
  filter(str_detect(URL, "アトラクション"))

head(attraction)
id park area ido keido URL open
オムニバス TDL ワールドバザール 35.6328665 139.8799643 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
ペニーアーケード TDL ワールドバザール 35.6340014 139.87741 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
ウエスタンリバー鉄道 TDL アドベンチャーランド 35.6337201 139.8801419 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
カリブの海賊 TDL アドベンチャーランド 35.6342728 139.8785159 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
ジャングルクルーズ:ワイルドライフ・エクスペディション TDL アドベンチャーランド 35.6338175 139.880021 http://ja.dbpedia.org/resource/アトラクション 1983-04-15
スイスファミリー・ツリーハウス TDL アドベンチャーランド 35.6333234 139.8794404 http://ja.dbpedia.org/resource/アトラクション 1993-07-21
tail(attraction)
id park area ido keido URL open
66 ジャンピン・ジェリーフィッシュ TDS マーメイドラグーン 35.6265208 139.8823029 http://ja.dbpedia.org/resource/アトラクション 2001-09-04
67 ブローフィッシュ・バルーンレース TDS マーメイドラグーン 35.626473 139.8818256 http://ja.dbpedia.org/resource/アトラクション 2001-09-04
68 マーメイドラグーンシアター TDS マーメイドラグーン 35.626695 139.8816848 http://ja.dbpedia.org/resource/アトラクション 2001-09-04
69 ワールプール TDS マーメイドラグーン 35.6266785 139.8820283 http://ja.dbpedia.org/resource/アトラクション 2001-09-04
70 スカットルのスクーター TDS マーメイドラグーン 35.6272748 139.8821207 http://ja.dbpedia.org/resource/アトラクション 2001-09-04
71 フランダーのフライングフィッシュコースター TDS マーメイドラグーン 35.6270359 139.8811528 http://ja.dbpedia.org/resource/アトラクション 2001-09-04

これでアトラクションだけ持ってこれます。

疲れた

サンプルのデータが文字多めだったこともあって、文字列の操作みたいになっちゃいました。filterなんかは数値計算にも使えます(変数の要素が10以上みたいな感じ)。

ほんとはmutateとかgroup_by、そのままpurrrなんかも紹介したかったけど疲れたのでいったん区切ります。気が向いたらまたやります。