データフレームを縦方向に展開するには、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()の引数の意味
データフレームを指定します。
tidy-selectを指定できます。より長い形式にピボットする列を指定します。
メソッドに渡される追加の引数を指定します。
列を長い形式にピボットする場合、出力行は元の行番号に対してどのように配置するかを指定します。
- [デフォルト]fastest: colsの個々の行を出力で互いに近づけます。これにより、ピボット処理に関与しないデータから少なくとも1つのキー列がある場合、直感的に順序付けられた出力が生成されることがよくあります。
- slowest: colsの個々の列を出力で互いに近づけます。これにより、ピボット処理でデータのすべての列を利用すると、直感的に順序付けられた出力が得られることがよくあります。
colsで指定されたデータの列名に格納されている情報から作成する新しいカラムを指定する文字ベクトルを指定します。
- 長さが0の場合またはNULLが指定されている場合: 列は作成されません。
- 長さが1の場合: colsで指定された列名を含む1つの列が作成されます。
- 長さが>1の場合: 複数の列が作成されます。この場合、列名の分割方法を指定するために、names_sepまたはnames_patternのいずれかを指定する必要があります。また、次の2つの文字値も利用できます。
- NA: 列名の対応するコンポーネントを破棄します。
- .value: カラム名の対応するコンポーネントが、セル値を含む出力カラムの名前を定義し、values_to全体をオーバーライドすることを示します。
各列名の先頭から一致するテキストを削除するために使用される正規表現を指定します。
names_toに複数の値が含まれている場合、これらの引数は列名の分割方法を指定します。
names_sepは、separate()と同じ仕様を取り、数値ベクトル(分割する位置を指定)または単一の文字列(分割する正規表現を指定)のいずれかです。
これらの引数で十分な制御が得られない場合は、pivot_longer_spec()を使用してspecオブジェクトを作成し、必要に応じて手動で処理します。
names_patternは、正規表現であるextract()と同じ仕様を取ります。
これらの引数で十分な制御が得られない場合は、pivot_longer_spec()を使用してspecオブジェクトを作成し、必要に応じて手動で処理します。
必要に応じて、列名とプロトタイプのペアのリストを指定します。
あるいは、空のプロトタイプを1つ提供し、すべての列に適用することもできます。プロトタイプ(または略してptype)は、ベクトルの型およびクラス、属性を定義する長さ0のベクトル(integer()やnumeric()など)です。これらの引数は、作成された列が想定した型であることを確認する場合に使用します。特定の列のタイプを(確認する代わりに)変更する場合は、代わりにnames_transformまたはvalues_transformを使用する必要があることに注意してください。
必要に応じて、列名と関数のペアのリストを指定します。
または、1つの関数を指定して、すべての列に適用することもできます。これらの引数は、特定の列の型を変更する必要がある場合に使用します。たとえば、names_transform = list(week = as.integer)は、week という文字変数を整数に変換します。
指定しない場合、names_toから生成される列の型は文字になり、values_toから生成される変数の型は、その生成に使用される入力列の共通型になります。
出力に無効な列名がある場合にどうするかを指定します。
- [デフォルト]check_unique: 列が重複している場合にエラーになります。
- minimal: 出力に重複を許可します。
- unique: 数値の接尾辞を追加して重複を排除します。
その他のオプションについては、vctrs::vec_as_names()を参照してください。
セル値に格納されたデータから作成する列名を指定する文字列を指定します。
names_toが特別な.valueセンチネルを含む文字である場合、この値は無視され、valueカラムの名前は既存のカラム名の一部から派生します。
TRUEの場合、value_to列に欠損値NAのみを含む行を削除します。これにより、明示的な欠損値が暗黙的な欠損値に効果的に変換され、通常は、データ内の欠損値がその構造体によって作成された場合にのみ使用する必要があります。
必要に応じて、列名とプロトタイプのペアのリストを指定します。
あるいは、空のプロトタイプを1つ提供し、すべての列に適用することもできます。プロトタイプ(または略してptype)は、ベクトルの型およびクラス、属性を定義する長さ0のベクトル(integer()やnumeric()など)です。これらの引数は、作成された列が想定した型であることを確認する場合に使用します。特定の列のタイプを(確認する代わりに)変更する場合は、代わりにnames_transformまたはvalues_transformを使用する必要があることに注意してください。
必要に応じて、列名と関数のペアのリストを指定します。
または、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