SQLの SELECT FIELD1, COUNT(*) FROM TABLE GROUP BY FIELD1 のように、特定のグループごとの集計を行う方法をR言語で解説します。
🔢 グループ別の集計 (GROUP BYと集計関数)
SQLの GROUP BY 句と集合関数(COUNT, SUM, AVG など)を組み合わせた操作は、R言語では dplyr パッケージの group_by() と summarise()(または summarize())の2つの関数をパイプ (%>%) でつなげて実行します。
Rでの基本的な手順
group_by(): グループ化の基準となる列(SQLのGROUP BY句の列)を指定します。summarise(): グループごとに実行したい集計関数(SQLのCOUNT,SUM,AVGなど)を指定します。
| SQL | R言語 (dplyr) | 説明 |
SELECT F1, COUNT(*) FROM T GROUP BY F1 | T %>% group_by(F1) %>% summarise(Count = n()) | データフレーム T を F1 でグループ化し、各グループの行数を Count として計算します。 |
コード例
データフレーム sales_records を使用し、「部署 (dept) ごとの取引件数(transaction_count)」を計算する例です。
R
# SQL:
# SELECT dept, COUNT(*) AS transaction_count
# FROM sales_records
# GROUP BY dept;
# R言語:
library(dplyr)
sales_records %>%
group_by(dept) %>% # 1. 部署(dept)ごとにグループ化
summarise(
transaction_count = n() # 2. 各グループの行数(件数)をカウント
)
複数の集計と欠損値(NA)の処理
summarise() 関数内では、複数の集計関数を同時に実行したり、前述の**欠損値(NA)**処理を行うことができます。
応用コード例
「部署 (dept) ごとの平均売上 (avg_revenue) と合計取引数 (total_count)」を計算する例です。
R
# SQLの意図:
# SELECT dept, AVG(revenue), COUNT(transaction_id)
# FROM sales_records
# GROUP BY dept;
# R言語:
sales_records %>%
group_by(dept) %>%
summarise(
avg_revenue = mean(revenue, na.rm = TRUE), # 平均値 (NAを無視して計算)
total_count = n() # グループの行数 (COUNT(*))
# total_id_count = sum(!is.na(transaction_id)) # 特定の列の非NAカウント
)
💡 COUNT(*) と n() の違い
SQLの COUNT(*) に対応するRの関数は n() です。これは、現在のグループに含まれる行数を返します。
SQLの COUNT(FIELD)(NULL値を除外して数える)に対応させたい場合は、sum(!is.na(FIELD)) を使用します。
!is.na(FIELD):FIELDがNAでない場合にTRUE(1) を返すsum(...):TRUEの数を合計する
これで、SQLの GROUP BY を使ったグループ別集計の操作をR言語で実行できます。