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

pivot_wider()の概要

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

pivot_widerの使い方

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


pivot_wider(
  data,
  ...,
  id_cols = NULL,
  id_expand = FALSE,
  names_from = name,
  names_prefix = "",
  names_sep = "_",
  names_glue = NULL,
  names_sort = FALSE,
  names_vary = "fastest",
  names_expand = FALSE,
  names_repair = "check_unique",
  values_from = value,
  values_fill = NULL,
  values_fn = NULL,
  unused_fn = NULL
)

pivot_longer()の引数の意味

data

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

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

id_cols = NULL

tidy-selectを指定できます。各オブザベーションを一意に識別する列の集合を指定します。
通常、冗長な変数、つまり値が既存の変数と完全に相関している変数がある場合に使用されます。
デフォルトは、names_fromとvalues_fromで指定された列を除く、データ内のすべての列です。tidyselect式が指定されている場合、names_fromとvalues_fromで指定された列を削除した後で、データに対して評価されます。

id_expand = FALSE

id_cols列の値は、ピボットする前にexpand()で展開する必要があるかどうかを指定します。
これにより、行数が増え、出力にはid_cols内のすべての可能な値の完全な展開が含まれます。データで表されていない暗黙的な因子水準は明示的になります。さらに、展開されたid_colsに対応する行の値が並べ替えられます。

names_from = name

tidy-selectを指定できます。出力列の名前を取得する列(names_from)と、セル値を取得する列(values_from)を記述する引数のペアを指定します。

names_prefix = “”

すべての変数名の先頭に追加される文字列を指定します。
これは、names_fromが数値ベクトルであり、構文変数名を作成する場合に特に便利です。

names_sep = “_”

names_fromまたはvalues_fromに複数の変数が含まれている場合、これを使用してそれらの値を1つの文字列に結合し、列名として使用します。

names_glue = NULL

names_sepとnames_prefixの代わりに、names_from列(および特別な.value)を使用してカスタム列名を作成するglue仕様を指定できます。

names_sort = FALSE

列名を並べ替える必要があるかどうかを指定します。
デフォルトのFALSEの場合、カラム名は最初に出現した順に並べられます。

names_vary = “fastest”

names_fromが複数の一意の値を持つ列(または複数の列)を識別し、複数のvalues_from列が指定されている場合、結果の列名はどのような順序で組み合わせる必要があるかを指定します。

  • [デフォルト]fastest: names_from値を最も速く変化させるため、列の命名スキームはvalue1_name1、value1_name2、value2_name1、value2_name2の形式になります。
  • slowest: names_from値の変化が最も遅く、value1_name1、value2_name1、value1_name2、value2_name2 という形式の列命名スキームになります。
names_expand = FALSE

names_from列の値は、ピボットする前にexpand()で展開する必要があるかどうかを指定します。
これにより、列が増え、出力には、names_from内のすべての可能な値の完全な展開に対応する列名が含まれます。データで表されていない暗黙的な因子水準は明示的になります。さらに、列名は、names_sortが生成するものと同じように並べ替えられます。

names_repair = “check_unique”

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

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

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

values_from = value

tidy-selectを指定できます。出力列の名前を取得する列(names_from)と、セル値を取得する列(values_from)を記述する引数のペアを指定します。

values_fill = NULL

必要に応じて、欠落している場合に各値に何を入力するかを指定する(スカラー)値を指定します。
これは、異なる値の列に異なる入力値を適用する場合に、名前付きリストにすることができます。

values_fn = NULL

必要に応じて、出力の各セルの値に適用される関数を指定します。
通常、id_cols列とnames_from列の組み合わせが観測値を一意に識別しない場合に使用します。これは、異なるvalues_from列に異なる集計を適用する場合に、名前付きリストにすることができます。

unused_fn = NULL

オプションで、未使用の列(つまり、id_colsまたはnames_from、values_fromで識別されない列)からの値を要約するために適用される関数を指定します。
デフォルトでは、結果から未使用の列がすべて削除されます。これは、異なる未使用の列に異なる集計を適用する場合に、名前付きリストにすることができます。
unused_fnを有用にするには、id_colsを指定する必要があります。そうしないと、指定されていないすべての列がid_colsと見なされるためです。これは、id_colsでグループ化し、unused_fnを使用して未使用の列を集計するのと似ています。

準備

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


library(tidyverse)

解説のために、sleepデータセットを使用します。sleepデータセットは、生徒の睡眠データで、10人の患者に対する2つの飲酒薬の効果(対照群と比較して睡眠時間の増加)を示すデータが格納されています。

データ型 説明
extra numeric 睡眠時間の増加
group factor 与えられた薬
ID factor 患者ID

sleep

   extra group ID
1    0.7     1  1
2   -1.6     1  2
3   -0.2     1  3
4   -1.2     1  4
5   -0.1     1  5
6    3.4     1  6
7    3.7     1  7
8    0.8     1  8
9    0.0     1  9
10   2.0     1 10
11   1.9     2  1
12   0.8     2  2
13   1.1     2  3
14   0.1     2  4
15  -0.1     2  5
16   4.4     2  6
17   5.5     2  7
18   1.6     2  8
19   4.6     2  9
20   3.4     2 10

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

sleepデータセットで、列groupの値を列にして、列extraを値に持つように展開するには次のようにします。


sleep |>
  pivot_wider(names_from = group, values_from = extra)

# A tibble: 10 × 3
   ID      `1`   `2`
     
 1 1       0.7   1.9
 2 2      -1.6   0.8
 3 3      -0.2   1.1
 4 4      -1.2   0.1
 5 5      -0.1  -0.1
 6 6       3.4   4.4
 7 7       3.7   5.5
 8 8       0.8   1.6
 9 9       0     4.6
10 10      2     3.4
R入門 データフレームの横方向の展開