5.2 縦長(long)データと横長(wide)データの相互変換

5.2.1 pivot_longer()関数を用いたwideからlongへの変換

table4atable4bは、列名が19992000というように「年」に関する変数の観測値となっています。また、テーブル内部の数値は、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引数に、観測値が列名となっている列の一覧をdplyrselect()関数で変数を選択する場合と同様の形式(ただし、複数の変数の列挙は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_tovalues_toは、新たに設定する変数名であり、table4aに含まれる列名ではありませんので、ダブルクォートをつけて文字列として指定する必要があります。

5.2.2 pivot_wider()関数を用いたwideからlongへの変換

table2は1つの観測(各国の1年分の観測)が2行にまたがっています。これはtidydataの1行が1観測という原則を満たしておらず、tidydataではありません。これをtidydataにするためには、count列を広げて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引数にそれらの変数名に対応した値が格納されている列(ここではcount)を指定します。これらは、データフレーム内の変数名ですので、ダブルクォートはつけません。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