5.1 tidydataとは?
以下の原則を満たすデータを、tidydataと呼びます。
- 各変数には専用の列がある
- 各観測には専用の行がある
- 各値は専用のセルにある
データはさまざまな形で提供されますが、tidydataの形式に変換することで、分析や可視化がスムーズに行えるようになります。tidyverseに含まれるパッケージ群は、tidydataを前提とした関数を提供しています。その中でも、tidyでないデータをtidydataに変換する関数を提供するパッケージがtidyrパッケージです。
例えば、以下のようなデータはtidydataです。
table1 <- tibble(
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ではありません。
table2 <- table1 %>%
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ではありません。
table3 <- table1 %>%
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ではありません。
table4a <- table1 %>%
select(-population) %>%
pivot_wider(names_from = year, values_from = cases)| country | 1999 | 2000 |
|---|---|---|
| Afghanistan | 745 | 2666 |
| Brazil | 37737 | 80488 |
| China | 212258 | 213766 |
table4b <- table1 %>%
select(-cases) %>%
pivot_wider(names_from = year, values_from = population)| country | 1999 | 2000 |
|---|---|---|
| Afghanistan | 19987071 | 20595360 |
| Brazil | 172006362 | 174504898 |
| China | 1272915272 | 1280428583 |