5.2 縦長(long)データと横長(wide)データの相互変換
5.2.1 pivot_longer()
関数を用いたwideからlongへの変換
table4a
やtable4b
は、列名が1999
や2000
というように「年」に関する変数の観測値となっています。また、テーブル内部の数値は、table4a
の場合cases
の観測値、table4b
の場合はpopulation
の観測値というように、単一の変数の観測値が複数列にまたがっています。このような形のテーブルとなっているデータのことを横長(wide型)データと呼びます。
::kable(table4a) knitr
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()
関数を用いたwideからlongへの変換
table2
は1つの観測(各国の1年分の観測)が2行にまたがっています。これはtidydataの1行が1観測という原則を満たしておらず、tidydataではありません。これをtidydataにするためには、count
列を広げてkey
列の値を変数名とした新たな列を作成する必要があります。
::kable(table2) knitr
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