11.グループ別の集計結果を絞り込む-SQL経験者のためのR入門

SQLの SELECT FIELD1, COUNT(*) FROM TABLE GROUP BY FIELD1 HAVING COUNT(*) > 2 のように、グループ化して集計した後、その集計結果に対して条件を適用し、表示するグループを絞り込む方法をR言語で解説します。


🧐 グループの絞り込み (HAVING句)

SQLの HAVING 句は、GROUP BY によって作成されたグループに対して、集計値(COUNT(), SUM(), AVG() など)に基づいた条件を適用するために使われます。

R言語では、dplyr パッケージの filter() 関数を、group_by()summarise() の間に挿入するか、または summarise() の直後に使用することで、HAVING と同様の機能を実現できます。

Rでの基本的な手順

  1. group_by(): グループ化の基準となる列を指定します。
  2. summarise(): グループごとの集計値を計算し、新しいデータフレームを作成します。
  3. filter(): 作成された集計値の列に対して条件を適用し、表示するグループを絞り込みます。
SQLR言語 (dplyr)説明
GROUP BY F1 HAVING COUNT(*) > 2group_by(F1) %>% summarise(N = n()) %>% filter(N > 2)F1 でグループ化し、グループごとの行数(N)を計算した後、その N が 2 より大きいグループのみを抽出します。

コード例

データフレーム orders を使用し、「注文数(order_count)が $2$ 件を超える顧客(customer_id)のみを抽出する」例です。

R

# SQL:
# SELECT customer_id, COUNT(*)
# FROM orders
# GROUP BY customer_id
# HAVING COUNT(*) > 2;

# R言語:
library(dplyr)

orders %>%
  group_by(customer_id) %>% # 1. 顧客IDごとにグループ化
  summarise(
    order_count = n()       # 2. グループごとの注文数をカウント
  ) %>%
  filter(order_count > 2)   # 3. HAVING句の適用: 注文数が2を超えるグループのみをフィルタリング

💡 filter() と HAVING の役割の対応

R言語の dplyr では、データ操作の流れが明確です。

  • filter()group_by()に使う $\rightarrow$ SQLの WHERE 句(集計前の行の絞り込み)
  • filter()summarise()に使う $\rightarrow$ SQLの HAVING 句(集計結果のグループの絞り込み)

summarise() の実行後には、データフレームはグループ列と集計値の列のみで構成されるため、その後の filter() は自動的に集計値を使ったグループ絞り込みとして機能します。

これで、SQLの HAVING 句を使ったグループの絞り込みをR言語で実行できます。