10.グループ別の集計-SQL経験者のためのR入門

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での基本的な手順

  1. group_by(): グループ化の基準となる列(SQLの GROUP BY 句の列)を指定します。
  2. summarise(): グループごとに実行したい集計関数(SQLの COUNT, SUM, AVG など)を指定します。
SQLR言語 (dplyr)説明
SELECT F1, COUNT(*) FROM T GROUP BY F1T %>% group_by(F1) %>% summarise(Count = n())データフレーム TF1グループ化し、各グループの行数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言語で実行できます。