R言語でデータフレームをグループごとに集計する方法について解説します。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのgroup_by()とsummarise()を使用した方法についてお伝えします。group_by()とsummarise()を使用する利点は、パイプ演算子と親和性が高くR言語に標準で搭載されている機能を使用する方法よりも可読性が高いコードが書けることが挙げられます。

group_by()の概要

group_by()は、1つ以上の列でグループ化するための関数です。group_by()は、既存のデータフレームを受け取り、それをグループ化されたデータフレームに変換します。この操作は「グループ別」に実行されます。

group_by()の使い方

dplyr::group_by()の使い方は次になります。


group_by(.data, ..., .add = FALSE, .drop = group_by_drop_default(.data))

group_by()の引数の意味

.data

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

group_by()では、グループ化する変数または計算です。
計算は常にグループ化されていないデータフレームで実行されます。グループ化されたデータで計算を実行するには、group_by()の前に別のmutate()ステップを使用する必要があります。nest_by()では計算は許可されません。ungroup()では、グループ化から削除する変数です。

.add = FALSE

デフォルトのFALSEの場合、group_by()は既存のグループを上書きします。既存のグループに追加するには、.add = TRUE を使用します。
この引数は以前はaddと呼ばれていましたが、addという新しいグループ化変数を作成できず、命名規則と競合します。

.drop = group_by_drop_default(.data)

データに表示されない因子レベルによって形成されたグループを削除するかどうかを指定します。
.data が以前に .drop = FALSEでグループ化されている場合を除き、デフォルトはTRUEです。

ungroup()の概要

group_by()は、グループ化を解除するための関数です。

dplyr::ungroup()の使い方は次になります。


ungroup(x, ...)

ungroup()の引数の意味

x

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

summarise()の概要

summarise()は、各グループを1行にまとめるための関数です。summarise()は新しいデータフレームを作成します。グループ化変数の組み合わせごとに1行を返します。グループ化列がない場合、出力には入力内のすべての観測値を要約した1行が含まれます。グループ化変数ごとに1列、指定した要約統計ごとに1列が含まれます。
summarise()とsummary()は同義語です。


summarise(.data, ..., .by = NULL, .groups = NULL)

summarize(.data, ..., .by = NULL, .groups = NULL)
.data

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

集計関数の名前と値のペアを指定します。
名前は結果の変数の名前になります。値は次のようになります。

  • 長さ1のベクトル(例: min(x)、n()、sum(is.na(y))
  • 単一の式から複数の列を追加するためのデータフレーム

[非推奨]サイズが0または1より大きい値を返すことは、1.1.0以降非推奨になりました。代わりにreframe()を使用します。

.by = NULL

tidy-selectを指定できます。オプションで、この操作のみでグループ化する列の選択を指定します。
group_by()の代替として機能します。

.groups = NULL

[試験的]結果のグループ化構造を指定します。

  • drop_last: グループ化の最後のレベルを削除します。これはバージョン1.0.0より前で唯一サポートされていたオプションでした
  • drop: グループ化のすべてのレベルが削除されます
  • keep: .dataと同じグループ化構造です
  • rowwise: 各行は独自のグループです

.groupsが指定されていない場合は、結果の行数に基づいて選択されます。

  • すべての結果が1行の場合、「drop_last」が返されます。
  • 行数が変化する場合は、「keep」が返されます(可変行数を返すことは、すべてのレベルのグループ化を無条件に削除するreframe()に取って代わられたため、非推奨になりました)。

さらに、結果がグループ化されていない場合、オプション「dplyr.summarise.inform」がFALSEに設定されている場合、またはsummarise()がパッケージ内の関数から呼び出された場合を除き、その選択を通知するメッセージが表示されます。

準備

あらかじめ、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データセットで、列Speciesをグループとして、列Sepal.LengthとSepal.Width、Petal.Length、Petal.Widthを用いていくつかの要約として集計するには次のようにします。


iris |>
  group_by(Species) |>
  summarise(
    n = n(),                                 # グループサイズ
    Sepal.Length_mean = mean(Sepal.Length),  # Sepal.Lengthの平均値
    Sepal.Width_max = max(Sepal.Width),      # Sepal.Widthの最大値
    Petal.Length_min = min(Petal.Length),    # Petal.Lengthの最小値
    Petal.Width_sd = sd(Petal.Width)         # Petal.Widthの標準偏差
  )

# A tibble: 3 × 6
  Species        n Sepal.Length_mean Sepal.Width_max Petal.Length_min Petal.Width_sd
                                                      
1 setosa        50              5.01             4.4              1            0.105
2 versicolor    50              5.94             3.4              3            0.198
3 virginica     50              6.59             3.8              4.5          0.275
R入門 データフレームをグループごとに集計する方法