5.1 tidydataとは?
以下の原則を満たすデータを、tidydataと呼びます。
- 各変数には専用の列がある
- 各観測には専用の行がある
- 各値は専用のセルにある
データはさまざまな形で提供されますが、tidydataの形式に変換することで、分析や可視化がスムーズに行えるようになります。tidyverseに含まれるパッケージ群は、tidydataを前提とした関数を提供しています。その中でも、tidyでないデータをtidydataに変換する関数を提供するパッケージがtidyrパッケージです。
例えば、以下のようなデータはtidydataです。
<- tibble(
table1 country = c("Afghanistan", "Afghanistan", "Brazil", "Brazil", "China", "China"),
year = rep(c(1999L, 2000L), 3),
cases = c(745L, 2666L, 37737L, 80488L, 212258L, 213766L),
population = c(19987071L, 20595360L, 172006362L, 174504898L, 1272915272L, 1280428583L)
)
country | year | cases | population |
---|---|---|---|
Afghanistan | 1999 | 745 | 19987071 |
Afghanistan | 2000 | 2666 | 20595360 |
Brazil | 1999 | 37737 | 172006362 |
Brazil | 2000 | 80488 | 174504898 |
China | 1999 | 212258 | 1272915272 |
China | 2000 | 213766 | 1280428583 |
以下のデータは、cases
とpopulation
の値がcount
に混在しており、それぞれが専用の列をもたない形になっているため、tidydataではありません。
<- table1 %>%
table2 pivot_longer(c(cases, population), names_to = "key", values_to = "value") %>%
arrange(country, year)
country | year | key | value |
---|---|---|---|
Afghanistan | 1999 | cases | 745 |
Afghanistan | 1999 | population | 19987071 |
Afghanistan | 2000 | cases | 2666 |
Afghanistan | 2000 | population | 20595360 |
Brazil | 1999 | cases | 37737 |
Brazil | 1999 | population | 172006362 |
Brazil | 2000 | cases | 80488 |
Brazil | 2000 | population | 174504898 |
China | 1999 | cases | 212258 |
China | 1999 | population | 1272915272 |
China | 2000 | cases | 213766 |
China | 2000 | population | 1280428583 |
以下のデータは、rate
の列におけるそれぞれのセルに複数の値が含まれているため、tidydataではありません。
<- table1 %>%
table3 unite(rate, cases, population, sep = "/")
country | year | rate |
---|---|---|
Afghanistan | 1999 | 745/19987071 |
Afghanistan | 2000 | 2666/20595360 |
Brazil | 1999 | 37737/172006362 |
Brazil | 2000 | 80488/174504898 |
China | 1999 | 212258/1272915272 |
China | 2000 | 213766/1280428583 |
以下のデータは、2つのテーブルにデータがまたがっているため、tidydataではありません。
<- table1 %>%
table4a select(-population) %>%
pivot_wider(names_from = year, values_from = cases)
country | 1999 | 2000 |
---|---|---|
Afghanistan | 745 | 2666 |
Brazil | 37737 | 80488 |
China | 212258 | 213766 |
<- table1 %>%
table4b select(-cases) %>%
pivot_wider(names_from = year, values_from = population)
country | 1999 | 2000 |
---|---|---|
Afghanistan | 19987071 | 20595360 |
Brazil | 172006362 | 174504898 |
China | 1272915272 | 1280428583 |