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

以下のデータは、casespopulationの値が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