【データハンドリング】pivot_longer()を使ってロング形式のパネルデータを作る

R
データ処理

ワイドからロングへ、データを変換します。

公開

2024年9月17日

はじめに

今回はtidyrpivot_longer()を使ってワイド形式のデータをロング形式にする方法をご紹介します。

使用するパッケージ

tidyverseを使用します。tidyverseにはdplyrtidyrをはじめとした諸パッケージが含まれているので、一括でやるのが便利で僕は好きです。

library(tidyverse)

データの準備

今回は適当に作成していきます。

df <- tibble(
  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)
)
表 1: ワイド形式のパネルデータ
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_long <- df |> 
  pivot_longer(
    cols = starts_with(c("Income_", "Population_")), 
    names_to = c(".value", "Year"), 
    names_sep = "_"
  )

colsではロング形式に変換したい変数を指定しています。dplyrstarts_with()を使えば、複数年分の変数を一括で指定することができます。今回はIncome_Population_で始まる変数という意味です。

names_toは新しい列名をどうするかを指定しています。names_sepで分割の区切りを指定しているのですが(この場合はアンダースコア)、その区切り前なら.value(すなわち、もとの名前のまま1)、区切り後はYearという列に格納するという意味です。

できたデータフレームは次のようになります。

表 2: ロング形式のパネルデータ
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

もし仮に、ロング形式に変換したい変数がすべてアンダースコアで区切られている場合2cols = contain("_")とすれば、変数が多くても一気に指定することができます。ただ今回の場合、Region_idがありますからうまくいきませんね。使える場面は限られそうです。

おわりに

今回はワイド形式のデータフレームをロング形式に変換する方法をご紹介しました。

僕自身pivot_longer()を使う時いつも何を指定すればいいんだっけ?となるので、備忘録的な意味合いが強いです😅

ご参考まで。

  1. この場合ならIncomePopulation↩︎

  2. 逆に言うと、ほかの変数はアンダースコアが用いられていない場合↩︎