Rでデータ分析を行う際、wide 形式のデータを long 形式に変換することがあります。特に、ggplotによる可視化や時系列分析、統計モデリングでは長形式のデータが扱いやすいからです。tidyverseパッケージの`pivot_longer()`関数を使うと、このような変換を簡単に行うことができます。
## サンプルデータの作成
まず、都市ごとの異なる月の気温データを例として使います。欠損値も含んでいます。
```r
# サンプルデータの作成(欠損値を含む)
temperature_data <- data.frame(
  city = c("Tokyo", "Osaka", "Sapporo"),
  month_0 = c(5, 7, -5),
  month_6 = c(28, 30, NA),  # 札幌のデータが欠損
  month_12 = c(5, NA, -7)   # 大阪のデータが欠損
)
# データの確認
temperature_data
```
結果は以下の通りです。
```R
> temperature_data
     city month_0 month_6 month_12
1   Tokyo       5      28        5
2   Osaka       7      30       NA
3 Sapporo      -5      NA       -7
```
このデータは3つの都市(Tokyo、Osaka、Sapporo)について、0ヶ月目、6ヶ月目、12ヶ月目の気温を記録しています。
## long 形式への変換
それでは long 形式に変換しましょう。
`tidyverse` パッケージをインストールしていない場合、 `install.packages("tidyverse")` を実行してインストールしてください。
```r
# tidyverseパッケージの読み込み
library(tidyverse)
# 長形式への変換
temperature_long <- pivot_longer(
  temperature_data,
  cols = starts_with("month_"),  # "month_"で始まる列をすべて選択
  names_to = "month_code",       # 元の列名を保存する変数名
  values_to = "temperature"      # 値を保存する変数名
)
# 変換後のデータを確認
temperature_long
```
結果は以下の通りです。
```R
> temperature_long
# A tibble: 9 × 3
  city    month_code temperature
  <chr>   <chr>            <dbl>
1 Tokyo   month_0              5
2 Tokyo   month_6             28
3 Tokyo   month_12             5
4 Osaka   month_0              7
5 Osaka   month_6             30
6 Osaka   month_12            NA
7 Sapporo month_0             -5
8 Sapporo month_6             NA
9 Sapporo month_12            -7
```
次に、`month_code`列から数字だけを抽出します。
`sub` については別に解説しています。 [[R - sub 関数での文字列置換]]
```r
# 数字部分の抽出
temperature_long$month <- as.numeric(sub("month_", "", temperature_long$month_code))
# 結果の確認
temperature_long
```
結果は以下の通りです。
```R
> temperature_long
# A tibble: 9 × 4
  city    month_code temperature month
  <chr>   <chr>            <dbl> <dbl>
1 Tokyo   month_0              5     0
2 Tokyo   month_6             28     6
3 Tokyo   month_12             5    12
4 Osaka   month_0              7     0
5 Osaka   month_6             30     6
6 Osaka   month_12            NA    12
7 Sapporo month_0             -5     0
8 Sapporo month_6             NA     6
9 Sapporo month_12            -7    12
```
この変換により、元の wide 形式データ(3都市×3時点)から long 形式のデータへと変換されました。欠損値(NA)は長形式データにもそのまま保持されています。