tibble
はじめに
環境設定
例のごとくtidyverseパッケージを読み込む
library(tidyverse)tibbleとは何か
- tibbleとは、tidyverseにおいてスタンダードとされるデータ形式である
- data.frameの拡張だと思えばよい
- readrでデータを読み込むとき、dplyrなどでデータ成型するときに自動的にtibble形式になることがある
- tidyverseの哲学と密接に関係があり、data.frameの欠点を補うデータ形式である
data.frameとの違い
data.frameとtibbleの違いを簡潔に書いていきたい
tibbleを眺める
まずはdplyrに含まれる大きめのデータフレームstarwarsを眺めてみる
starwarsは既にtibbleになっている
starwars# A tibble: 87 x 13
name height mass hair_color skin_color eye_color
<chr> <int> <dbl> <chr> <chr> <chr>
1 Luke Skywalker 172 77 blond fair blue
2 C-3PO 167 75 <NA> gold yellow
3 R2-D2 96 32 <NA> white, blue red
4 Darth Vader 202 136 none white yellow
5 Leia Organa 150 49 brown light brown
6 Owen Lars 178 120 brown, grey light blue
7 Beru Whitesun lars 165 75 brown light blue
8 R5-D4 97 32 <NA> white, red red
9 Biggs Darklighter 183 84 black light brown
10 Obi-Wan Kenobi 182 77 auburn, white fair blue-gray
# ... with 77 more rows, and 7 more variables: birth_year <dbl>,
# gender <chr>, homeworld <chr>, species <chr>, films <list>,
# vehicles <list>, starships <list>
- 1行目:このテーブルが87行13列であることが分かる
- 表示されているテーブルは明らかにそれよりも小さい
- 各列名の下に、その列の型(int, dbl, chr)などが示してある
- テーブル下部のコメント:表示されているもの以外にあと77行、7列が存在することが分かる
- また表示されていない変数名が分かる
これだけ見てもいかにtibble素晴らしいかが分かるだろう。つまり
- でかいデータフレームをどかっと表示してしまってコンソールが大変なことになる恐れがない
- それでいて全ての列名を確認することが出来る
- 列の型がしっかり示されており、factorかcharacterか、で混乱することがない
行名
tibble形式は、行名が存在することを許さない。例えば、次のようなデータフレームはよく見かけるだろう
x <- data.frame(3時 = c("晴れ", "曇り", "雨"), 5時 = c("晴れ", "晴れ", "晴れ"),
7時 = c("曇り", "晴れ", "晴れ"), row.names = c("東京", "大阪", "名古屋"))
x 3時 5時 7時
東京 晴れ 晴れ 曇り
大阪 曇り 晴れ 晴れ
名古屋 雨 晴れ 晴れ
このデータをtibble形式に変換する。変換にはas_tibble()を使う
as_tibble(x)# A tibble: 3 x 3
3時 5時 7時
* <fctr> <fctr> <fctr>
1 晴れ 晴れ 曇り
2 曇り 晴れ 晴れ
3 雨 晴れ 晴れ
行名が消えた!
この通り、tibbleは行名を許さない。これはtidy dataの哲学によるものである。
- ちなみに、各列はファクター型になっていることがわかる。
- データフレームを作成するときに自動的にファクター型になってしまったのである
- なんと愚かなデータフレーム、、、
tidy dataのおさらい
上記のデータは次のように表示されるべきである
x %>% rownames_to_column(var = "県") %>% gather(時刻, 天気, -県) 県 時刻 天気
1 東京 3時 晴れ
2 大阪 3時 曇り
3 名古屋 3時 雨
4 東京 5時 晴れ
5 大阪 5時 晴れ
6 名古屋 5時 晴れ
7 東京 7時 曇り
8 大阪 7時 晴れ
9 名古屋 7時 晴れ
tidy dataの原則
- 個々の変数 (variable) が1つの列 (column) をなす。
- 個々の観測 (observation) が1つの行 (row) をなす。
- 個々の観測の構成単位の類型 (type of observational unit) が1つの表 (table) をなす。
- 個々の値 (value) が1つのセル (cell) をなす
tibbleにまつわる色々
テーブルを省略せずに見る
全てみるには、View()を使えばよい。でかいので結果は割愛する
また、表示する行を10行から変更する場合にはoptions(tibble.print_min = n)とoptions()内で指定する。実例を示す
options(tibble.print_min = 30)
starwars# A tibble: 87 x 13
name height mass hair_color skin_color
<chr> <int> <dbl> <chr> <chr>
1 Luke Skywalker 172 77.0 blond fair
2 C-3PO 167 75.0 <NA> gold
3 R2-D2 96 32.0 <NA> white, blue
4 Darth Vader 202 136.0 none white
5 Leia Organa 150 49.0 brown light
6 Owen Lars 178 120.0 brown, grey light
7 Beru Whitesun lars 165 75.0 brown light
8 R5-D4 97 32.0 <NA> white, red
9 Biggs Darklighter 183 84.0 black light
10 Obi-Wan Kenobi 182 77.0 auburn, white fair
11 Anakin Skywalker 188 84.0 blond fair
12 Wilhuff Tarkin 180 NA auburn, grey fair
13 Chewbacca 228 112.0 brown unknown
14 Han Solo 180 80.0 brown fair
15 Greedo 173 74.0 <NA> green
16 Jabba Desilijic Tiure 175 1358.0 <NA> green-tan, brown
17 Wedge Antilles 170 77.0 brown fair
18 Jek Tono Porkins 180 110.0 brown fair
19 Yoda 66 17.0 white green
20 Palpatine 170 75.0 grey pale
21 Boba Fett 183 78.2 black fair
22 IG-88 200 140.0 none metal
23 Bossk 190 113.0 none green
24 Lando Calrissian 177 79.0 black dark
25 Lobot 175 79.0 none light
26 Ackbar 180 83.0 none brown mottle
27 Mon Mothma 150 NA auburn fair
28 Arvel Crynyd NA NA brown fair
29 Wicket Systri Warrick 88 20.0 brown brown
30 Nien Nunb 160 68.0 none grey
# ... with 57 more rows, and 8 more variables: eye_color <chr>,
# birth_year <dbl>, gender <chr>, homeworld <chr>, species <chr>,
# films <list>, vehicles <list>, starships <list>
nest
少し発展的な話をする
先ほどのstarwarsの後ろの方の列を眺める
options(tibble.print_min = 10)
starwars[, 8:13]# A tibble: 87 x 6
gender homeworld species films vehicles starships
<chr> <chr> <chr> <list> <list> <list>
1 male Tatooine Human <chr [5]> <chr [2]> <chr [2]>
2 <NA> Tatooine Droid <chr [6]> <chr [0]> <chr [0]>
3 <NA> Naboo Droid <chr [7]> <chr [0]> <chr [0]>
4 male Tatooine Human <chr [4]> <chr [0]> <chr [1]>
5 female Alderaan Human <chr [5]> <chr [1]> <chr [0]>
6 male Tatooine Human <chr [3]> <chr [0]> <chr [0]>
7 female Tatooine Human <chr [3]> <chr [0]> <chr [0]>
8 <NA> Tatooine Droid <chr [1]> <chr [0]> <chr [0]>
9 male Tatooine Human <chr [1]> <chr [0]> <chr [1]>
10 male Stewjon Human <chr [6]> <chr [1]> <chr [5]>
# ... with 77 more rows
おや?
- 後ろの3列の表示がなにやら奇妙
とは、、 - 列の型もlistとなっている
tibbleは、同じ型なら列になんでも含むことができる!!!
こんなこともできる
iris %>% group_by(Species) %>% nest()# A tibble: 3 x 2
Species data
<fctr> <list>
1 setosa <tibble [50 x 4]>
2 versicolor <tibble [50 x 4]>
3 virginica <tibble [50 x 4]>
列にtibbleを格納してしまうことだってできる!!!
以上でした。正直nestはやらなくてもいいと思います