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での基本的な手順
group_by(): グループ化の基準となる列を指定します。summarise(): グループごとの集計値を計算し、新しいデータフレームを作成します。filter(): 作成された集計値の列に対して条件を適用し、表示するグループを絞り込みます。
| SQL | R言語 (dplyr) | 説明 |
GROUP BY F1 HAVING COUNT(*) > 2 | group_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言語で実行できます。