R言語でデータフレームを縦方向に展開する方法について解説します。データ分析においては、元データが必ずしもデータ分析に適した形となっていません。そのため、データフレームを所望の形に変換する方法を習得する必要があります。ここでは、横長(ワイド)のデータフレームを縦長(ロング)のデータフレームに変換する方法、言い換えると列数を減らし行数を増やす操作をお伝えします。
データフレームを縦方向に展開するには、tidyverseパッケージに含まれているtidyrパッケージのpivot_longer()を使用します。

pivot_longer()の概要

pivot_longer()は、データフレームを横長(ワイド)から縦長(ロング)にするための関数です。pivot_longer()は、列数を減らし行数を増やします。

pivot_longerの使い方

tidyr::pivot_longer()の使い方は次になります。


pivot_longer(
  data,
  cols,
  ...,
  cols_vary = "fastest",
  names_to = "name",
  names_prefix = NULL,
  names_sep = NULL,
  names_pattern = NULL,
  names_ptypes = NULL,
  names_transform = NULL,
  names_repair = "check_unique",
  values_to = "value",
  values_drop_na = FALSE,
  values_ptypes = NULL,
  values_transform = NULL
)

pivot_longer()の引数の意味

data

データフレームを指定します。

cols

tidy-selectを指定できます。より長い形式にピボットする列を指定します。

メソッドに渡される追加の引数を指定します。

cols_vary = “fastest”

列を長い形式にピボットする場合、出力行は元の行番号に対してどのように配置するかを指定します。

  • [デフォルト]fastest: colsの個々の行を出力で互いに近づけます。これにより、ピボット処理に関与しないデータから少なくとも1つのキー列がある場合、直感的に順序付けられた出力が生成されることがよくあります。
  • slowest: colsの個々の列を出力で互いに近づけます。これにより、ピボット処理でデータのすべての列を利用すると、直感的に順序付けられた出力が得られることがよくあります。
names_to = “name”

colsで指定されたデータの列名に格納されている情報から作成する新しいカラムを指定する文字ベクトルを指定します。

  • 長さが0の場合またはNULLが指定されている場合: 列は作成されません。
  • 長さが1の場合: colsで指定された列名を含む1つの列が作成されます。
  • 長さが>1の場合: 複数の列が作成されます。この場合、列名の分割方法を指定するために、names_sepまたはnames_patternのいずれかを指定する必要があります。また、次の2つの文字値も利用できます。
    • NA: 列名の対応するコンポーネントを破棄します。
    • .value: カラム名の対応するコンポーネントが、セル値を含む出力カラムの名前を定義し、values_to全体をオーバーライドすることを示します。
names_prefix = NULL

各列名の先頭から一致するテキストを削除するために使用される正規表現を指定します。

names_sep = NULL

names_toに複数の値が含まれている場合、これらの引数は列名の分割方法を指定します。
names_sepは、separate()と同じ仕様を取り、数値ベクトル(分割する位置を指定)または単一の文字列(分割する正規表現を指定)のいずれかです。
これらの引数で十分な制御が得られない場合は、pivot_longer_spec()を使用してspecオブジェクトを作成し、必要に応じて手動で処理します。

names_pattern = NULL

names_patternは、正規表現であるextract()と同じ仕様を取ります。
これらの引数で十分な制御が得られない場合は、pivot_longer_spec()を使用してspecオブジェクトを作成し、必要に応じて手動で処理します。

names_ptypes = NULL

必要に応じて、列名とプロトタイプのペアのリストを指定します。
あるいは、空のプロトタイプを1つ提供し、すべての列に適用することもできます。プロトタイプ(または略してptype)は、ベクトルの型およびクラス、属性を定義する長さ0のベクトル(integer()やnumeric()など)です。これらの引数は、作成された列が想定した型であることを確認する場合に使用します。特定の列のタイプを(確認する代わりに)変更する場合は、代わりにnames_transformまたはvalues_transformを使用する必要があることに注意してください。

names_transform = NULL

必要に応じて、列名と関数のペアのリストを指定します。
または、1つの関数を指定して、すべての列に適用することもできます。これらの引数は、特定の列の型を変更する必要がある場合に使用します。たとえば、names_transform = list(week = as.integer)は、week という文字変数を整数に変換します。
指定しない場合、names_toから生成される列の型は文字になり、values_toから生成される変数の型は、その生成に使用される入力列の共通型になります。

names_repair = “check_unique”

出力に無効な列名がある場合にどうするかを指定します。

  • [デフォルト]check_unique: 列が重複している場合にエラーになります。
  • minimal: 出力に重複を許可します。
  • unique: 数値の接尾辞を追加して重複を排除します。

その他のオプションについては、vctrs::vec_as_names()を参照してください。

values_to = “value”

セル値に格納されたデータから作成する列名を指定する文字列を指定します。
names_toが特別な.valueセンチネルを含む文字である場合、この値は無視され、valueカラムの名前は既存のカラム名の一部から派生します。

values_drop_na = FALSE

TRUEの場合、value_to列に欠損値NAのみを含む行を削除します。これにより、明示的な欠損値が暗黙的な欠損値に効果的に変換され、通常は、データ内の欠損値がその構造体によって作成された場合にのみ使用する必要があります。

values_ptypes = NULL

必要に応じて、列名とプロトタイプのペアのリストを指定します。
あるいは、空のプロトタイプを1つ提供し、すべての列に適用することもできます。プロトタイプ(または略してptype)は、ベクトルの型およびクラス、属性を定義する長さ0のベクトル(integer()やnumeric()など)です。これらの引数は、作成された列が想定した型であることを確認する場合に使用します。特定の列のタイプを(確認する代わりに)変更する場合は、代わりにnames_transformまたはvalues_transformを使用する必要があることに注意してください。

values_transform = NULL

必要に応じて、列名と関数のペアのリストを指定します。
または、1つの関数を指定して、すべての列に適用することもできます。これらの引数は、特定の列の型を変更する必要がある場合に使用します。たとえば、names_transform = list(week = as.integer)は、week という文字変数を整数に変換します。
指定しない場合、names_toから生成される列の型は文字になり、values_toから生成される変数の型は、その生成に使用される入力列の共通型になります。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次のirisデータセットを使用します。


iris |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

データフレームを縦方向に展開する

irisデータセットで、列Sepal.LengthとSepal.Width、Petal.Length、Petal.Widthの値を列valueにまとめ、元の列名を列nameにするには次のようにします。


iris |>
  pivot_longer(cols = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width))

# A tibble: 600 × 3
   Species name         value
              
 1 setosa  Sepal.Length   5.1
 2 setosa  Sepal.Width    3.5
 3 setosa  Petal.Length   1.4
 4 setosa  Petal.Width    0.2
 5 setosa  Sepal.Length   4.9
 6 setosa  Sepal.Width    3  
 7 setosa  Petal.Length   1.4
 8 setosa  Petal.Width    0.2
 9 setosa  Sepal.Length   4.7
10 setosa  Sepal.Width    3.2
# ℹ 590 more rows
# ℹ Use `print(n = ...)` to see more rows
R入門 データフレームの縦方向の展開