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