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) をなす

参考:http://id.fnshr.info/2017/01/09/tidy-data-intro/

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はやらなくてもいいと思います

Yutaka Kuroki

2018年2月27日