tidyverseでは,データをtidy data(整然データ)のフォーマットに変換してから解析をする。 言い換えると,tidy dataはtidyverseにおけるデータ解析のための標準フォーマット。 tidyrは,tidy data作成のためのパッケージ。
install.packages("tidyverse")
library(tidyverse)
Tidyである条件
R for Data Science: 12 Tidy dataにわかりやすい例とともに説明がある。以下はそこにある例のメモ。
gatherを使って加工する
table4b # population
#> # A tibble: 3 x 3
#> country `1999` `2000`
#> * <chr> <int> <int>
#> 1 Afghanistan 19987071 20595360
#> 2 Brazil 172006362 174504898
#> 3 China 1272915272 1280428583
このデータを,以下のように変換してtidy dataにする。
table4b %>%
gather(`1999`, `2000`, key = "year", value = "population")
#> # A tibble: 6 x 3
#> country year population
#> <chr> <chr> <int>
#> 1 Afghanistan 1999 19987071
#> 2 Brazil 1999 172006362
#> 3 China 1999 1272915272
#> 4 Afghanistan 2000 20595360
#> 5 Brazil 2000 174504898
spreadは2つの列の値がkeyとvalue(値)になっている時,それを列データに整理する。 大抵データ幅が広がる。
table2
#> # A tibble: 12 x 4
#> country year type count
#> <chr> <int> <chr> <int>
#> 1 Afghanistan 1999 cases 745
#> 2 Afghanistan 1999 population 19987071
#> 3 Afghanistan 2000 cases 2666
#> 4 Afghanistan 2000 population 20595360
#> 5 Brazil 1999 cases 37737
#> # ... with 6 more rows
データの特徴
table2 %>%
spread(key = type, value = count)
#> # A tibble: 6 x 4
#> country year cases population
#> <chr> <int> <int> <int>
#> 1 Afghanistan 1999 745 19987071
#> 2 Afghanistan 2000 2666 20595360
#> 3 Brazil 1999 37737 172006362
#> 4 Brazil 2000 80488 174504898
#> 5 China 1999 212258 1272915272
separateは一つの列を複数の列に分ける。
table3
#> # A tibble: 6 x 3
#> country year rate
#> * <chr> <int> <chr>
#> 1 Afghanistan 1999 745/19987071
#> 2 Afghanistan 2000 2666/20595360
#> 3 Brazil 1999 37737/172006362
#> 4 Brazil 2000 80488/174504898
#> 5 China 1999 212258/1272915272
table3 %>%
separate(rate, into = c("cases", "population"))
#> # A tibble: 6 x 4
#> country year cases population
#> * <chr> <int> <chr> <chr>
#> 1 Afghanistan 1999 745 19987071
#> 2 Afghanistan 2000 2666 20595360
#> 3 Brazil 1999 37737 172006362
#> 4 Brazil 2000 80488 174504898
#> 5 China 1999 212258 1272915272
delimiterの指定方法
table3 %>%
separate(rate, into = c("cases", "population"), sep = "/")
上記の方法では,chr型のrate
の列が,2つのchr型の列になっている。数値に変換したい。
table3 %>%
separate(rate, into = c("cases", "population"), convert = TRUE)
整数値を分割することもできる。
table3 %>%
separate(year, into = c("century", "year"), sep = 2) # yearを2桁目で分割
#> # A tibble: 6 x 4
#> country century year rate
#> * <chr> <chr> <chr> <chr>
#> 1 Afghanistan 19 99 745/19987071
#> 2 Afghanistan 20 00 2666/20595360
#> 3 Brazil 19 99 37737/172006362
#> 4 Brazil 20 00 80488/174504898
#> 5 China 19 99 212258/1272915272
#> 6 China 20 00 213766/1280428583
uniteはseparate()
の逆。複数の列を1列に結合する。