library(tidyverse)
【データハンドリング】pivot_longer()を使ってロング形式のパネルデータを作る
R
データ処理
ワイドからロングへ、データを変換します。
はじめに
今回はtidyr
のpivot_longer()
を使ってワイド形式のデータをロング形式にする方法をご紹介します。
使用するパッケージ
tidyverse
を使用します。tidyverse
にはdplyr
やtidyr
をはじめとした諸パッケージが含まれているので、一括でやるのが便利で僕は好きです。
データの準備
今回は適当に作成していきます。
<- tibble(
df Region_id = 1:2,
Region = c("Region1", "Region2"),
Income_2000 = c(40000, 35000),
Income_2005 = c(42000, 37000),
Income_2010 = c(45000, 39000),
Population_2000 = c(500000, 450000),
Population_2005 = c(520000, 460000),
Population_2010 = c(540000, 470000)
)
Region_id | Region | Income_2000 | Income_2005 | Income_2010 | Population_2000 | Population_2005 | Population_2010 |
---|---|---|---|---|---|---|---|
1 | Region1 | 40000 | 42000 | 45000 | 500000 | 520000 | 540000 |
2 | Region2 | 35000 | 37000 | 39000 | 450000 | 460000 | 470000 |
2つの地域について収入と人口のデータを作りました。
ポイントは、主要なデータにおいて変数名_年
となっていることです。
pivot_longer()
を使う
一番ベーシックなやり方は次の通りです。
<- df |>
df_long pivot_longer(
cols = starts_with(c("Income_", "Population_")),
names_to = c(".value", "Year"),
names_sep = "_"
)
cols
ではロング形式に変換したい変数を指定しています。dplyr
のstarts_with()
を使えば、複数年分の変数を一括で指定することができます。今回はIncome_
とPopulation_
で始まる変数という意味です。
names_to
は新しい列名をどうするかを指定しています。names_sep
で分割の区切りを指定しているのですが(この場合はアンダースコア)、その区切り前なら.value
(すなわち、もとの名前のまま1)、区切り後はYear
という列に格納するという意味です。
できたデータフレームは次のようになります。
Region_id | Region | Year | Income | Population |
---|---|---|---|---|
1 | Region1 | 2000 | 40000 | 500000 |
1 | Region1 | 2005 | 42000 | 520000 |
1 | Region1 | 2010 | 45000 | 540000 |
2 | Region2 | 2000 | 35000 | 450000 |
2 | Region2 | 2005 | 37000 | 460000 |
2 | Region2 | 2010 | 39000 | 470000 |
もし仮に、ロング形式に変換したい変数がすべてアンダースコアで区切られている場合2、cols = contain("_")
とすれば、変数が多くても一気に指定することができます。ただ今回の場合、Region_id
がありますからうまくいきませんね。使える場面は限られそうです。
おわりに
今回はワイド形式のデータフレームをロング形式に変換する方法をご紹介しました。
僕自身pivot_longer()
を使う時いつも何を指定すればいいんだっけ?となるので、備忘録的な意味合いが強いです😅
ご参考まで。