5.2 縦長(long)データと横長(wide)データの相互変換
5.2.1 pivot_longer()関数を用いたwideからlongへの変換
table4aやtable4bは、列名が1999や2000というように「年」に関する変数の観測値となっています。また、テーブル内部の数値は、table4aの場合casesの観測値、table4bの場合はpopulationの観測値というように、単一の変数の観測値が複数列にまたがっています。このような形のテーブルとなっているデータのことを横長(wide型)データと呼びます。
knitr::kable(table4a)| country | 1999 | 2000 |
|---|---|---|
| Afghanistan | 745 | 2666 |
| Brazil | 37737 | 80488 |
| China | 212258 | 213766 |
このデータを、year列に「年」の観測値(1999もしくは2000)、cases列にcasesの観測値を格納する形式、すなわち縦長(long型)データに変換するには、pivot_longer()関数を用います。
pivot_longer()関数の第1引数はdplyrのverbと同様にデータフレームとなります。また、関数を適用した結果もデータフレームになりますので、パイプ処理の中で利用できます。第2引数に、観測値が列名となっている列の一覧をdplyrのselect()関数で変数を選択する場合と同様の形式(ただし、複数の変数の列挙はc()関数を使う)で与えます。また、それらに対する新たに設定する変数名をnames_to引数に文字列として指定し、それらの値に対して新たに設定する変数名をvalues_to引数に文字列として指定します。table4aに対しては、例えば以下のようにします。
table4a %>%
pivot_longer(-country, names_to = "year", values_to = "cases")## # A tibble: 6 x 3
## country year cases
## <chr> <chr> <int>
## 1 Afghanistan 1999 745
## 2 Afghanistan 2000 2666
## 3 Brazil 1999 37737
## 4 Brazil 2000 80488
## 5 China 1999 212258
## 6 China 2000 213766
観測値が列名となっている列の一覧は、c(1999,2000)のような形式でもいいですが、ここではcountry以外のすべての列ということで、-countryとしています。また、names_toとvalues_toは、新たに設定する変数名であり、table4aに含まれる列名ではありませんので、ダブルクォートをつけて文字列として指定する必要があります。
5.2.2 pivot_wider()関数を用いたlongからwideへの変換
table2は1つの観測(各国の1年分の観測)が2行にまたがっています。これはtidydataの1行が1観測という原則を満たしておらず、tidydataではありません。これをtidydataにするためには、value列を広げてkey列の値を変数名とした新たな列を作成する必要があります。
knitr::kable(table2)| 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 |
これは、前のセクションにおけるpivot_longer()と逆の操作に相当し、long形式からwide形式への変換となります。これを行うのがpivot_wider()関数です。
pivot_wider()関数もpivot_longer()関数と同様にパイプ処理の中で利用できます。names_from引数に変数名を含む列(ここではkey)、values_from引数にそれらの変数名に対応した値が格納されている列(ここではvalue)を指定します。これらは、データフレーム内の変数名ですので、ダブルクォートはつけません。table2に対しては例えば以下のようにします。
table2 %>%
pivot_wider(names_from = key, values_from = value)## # 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
## 6 China 2000 213766 1280428583