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)は長形式データにもそのまま保持されています。