グループ別集計とgroup_by()
グループごとにデータを集計し、各グループの統計量を計算します。
「グループ別集計とgroup_by()」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
データをグループ化する理由
データのグループ化は、データ分析で最も強力な操作の 1 つです。データセット全体で統計量を計算するのではなく、各グループ内で計算します。dplyr パッケージでは、group_by() に続けて summarize() を使うことで、直感的に実行できます。
library(dplyr)
# Sample sales data
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
print(sales)group_by() の基本
group_by(col) は、後続の操作がグループごとに行われるようデータフレームに印を付けます。データ自体は変更せず、グループ化のメタデータを追加します。1 列でも複数列でもグループ化できます。
library(dplyr)
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
# Group by region
grouped <- sales %>% group_by(region)
print(grouped)
print(group_keys(grouped))group_by() の後の summarize()
summarize()(または summarise())は、各グループを 1 行にまとめます。新しい列名と、適用する集計関数を指定します。よく使う関数には、n()、mean()、sum()、min()、max() があります。
library(dplyr)
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
sales %>%
group_by(region) %>%
summarize(
n = n(),
mean_revenue = mean(revenue),
total_units = sum(units)
)n() によるカウント
summarize() 内の n() は、各グループの行数を返します。引数は必要ありません。条件に一致する行を数えるには、sum(condition) を使います。n_distinct(col) は一意な値の数を数えます。
library(dplyr)
employees <- data.frame(
dept = c('HR','HR','Eng','Eng','Eng','Sales'),
salary = c(55000, 60000, 95000, 105000, 90000, 70000),
senior = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
)
employees %>%
group_by(dept) %>%
summarize(
count = n(),
senior_count = sum(senior),
avg_salary = mean(salary)
)複数列によるグループ化
group_by() には複数の列を渡せます。データに存在する値のあらゆる組み合わせによってグループが作られます。クロス集計や階層的な集計に便利です。
library(dplyr)
orders <- data.frame(
region = c('North','North','South','South','North','South'),
product = c('A','B','A','B','A','A'),
sales = c(100, 200, 150, 250, 120, 180)
)
orders %>%
group_by(region, product) %>%
summarize(
total_sales = sum(sales),
orders = n(),
.groups = 'drop'
).groups 引数
summarize() の後、結果は最後のグループ化変数以外のすべてで引き続きグループ化されています。.groups 引数でこの動作を制御できます。
'drop_last'— デフォルト。最後のグループ階層を削除します'drop'— すべてのグループ化を解除します'keep'— すべてのグループ化を保持します
library(dplyr)
df <- data.frame(
year = c(2022,2022,2023,2023),
quarter = c('Q1','Q2','Q1','Q2'),
revenue = c(100, 120, 130, 150)
)
# .groups = 'drop' ensures ungrouped result
result <- df %>%
group_by(year, quarter) %>%
summarize(total = sum(revenue), .groups = 'drop')
print(result)
print(is.grouped_df(result)) # FALSEungroup() による明示的な解除
いつでも ungroup() を呼び出して、データフレームからグループ化のメタデータを削除できます。後続の操作をグループごとではなくデータ全体に対して行いたい場合に重要です。
library(dplyr)
df <- data.frame(
dept = c('HR','HR','Eng','Eng'),
salary = c(55000, 60000, 95000, 105000)
)
# Without ungroup: rank is within group
df %>%
group_by(dept) %>%
mutate(rank_in_dept = rank(salary)) %>%
ungroup() %>%
mutate(rank_overall = rank(salary))group_keys() と n_groups()
group_keys() は、一意なグループの組み合わせを示すデータフレームを返します。n_groups() はグループ数を返します。グループ化された操作を実行する前の確認に便利です。
library(dplyr)
df <- data.frame(
country = c('US','US','UK','UK','DE'),
category = c('A','B','A','A','B'),
value = c(10, 20, 15, 25, 30)
)
grouped <- df %>% group_by(country, category)
cat('Number of groups:', n_groups(grouped), '\n')
print(group_keys(grouped))複数の統計量による集計
1 回の summarize() 呼び出しで、多くの要約統計量を計算できます。カウント、平均、中央値、標準偏差、最小値、最大値、カスタム計算を一度に組み合わせられます。
library(dplyr)
scores <- data.frame(
class = c('A','A','A','B','B','B','C','C'),
score = c(85, 90, 78, 92, 88, 95, 70, 75)
)
scores %>%
group_by(class) %>%
summarize(
n = n(),
mean_score = round(mean(score), 1),
median_score = median(score),
sd_score = round(sd(score), 2),
min_score = min(score),
max_score = max(score)
)グループ対応の mutate()
group_by() の後に mutate() を使うと、各グループ内で値を計算しながら、すべての行を保持します(summarize() とは異なります)。各行に付加したいグループ単位の指標を計算するのに最適です。
library(dplyr)
sales <- data.frame(
region = c('East','East','West','West','West'),
rep = c('Alice','Bob','Carol','Dave','Eve'),
revenue = c(150, 200, 120, 180, 160)
)
sales %>%
group_by(region) %>%
mutate(
region_total = sum(revenue),
pct_of_region = round(100 * revenue / sum(revenue), 1)
) %>%
ungroup()グループ内のフィルタリング
group_by() の後に filter() を使うと、グループ単位の条件に基づいて行をフィルタリングできます。たとえば、地域ごとの上位成績者だけを残したり、グループ平均を上回る値の行だけを残したりできます。
library(dplyr)
sales <- data.frame(
region = c('East','East','West','West','North','North'),
rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
revenue = c(150, 200, 120, 180, 95, 130)
)
# Keep the top rep per region
sales %>%
group_by(region) %>%
filter(revenue == max(revenue)) %>%
ungroup()クイックチェック
summarize() の .groups = 'drop' 引数は何をしますか?
まとめ: グループ化した集計
グループ化した集計の重要ポイント:
group_by(col)はグループ化を追加します。データは変わりませんが、操作がグループを意識したものになりますsummarize()は各グループを 1 行にまとめます。n()、mean()、sum()などを使います.groups = 'drop'は結果のグループ化を解除しますungroup()は任意の時点でグループ化を削除しますgroup_keys()はグループ階層を確認し、n_groups()はその数を数えますmutate()+group_by()は、行をまとめずにグループ単位の列を追加します
library(dplyr)
# Full pipeline example
data.frame(
dept = c('Eng','Eng','HR','HR','Sales'),
salary = c(95000, 110000, 60000, 65000, 75000)
) %>%
group_by(dept) %>%
summarize(
headcount = n(),
avg_salary = mean(salary),
.groups = 'drop'
) %>%
arrange(desc(avg_salary))よくある質問
「グループ別集計とgroup_by()」レッスンは無料ですか?
はい。「グループ別集計とgroup_by()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「グループ別集計とgroup_by()」で何を学びますか?
グループごとにデータを集計し、各グループの統計量を計算します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「グループ別集計とgroup_by()」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- グループ別集計とgroup_by()
- ウィンドウ関数:lag、lead、cumsum
- dplyrでの複数テーブル結合
- Tidy評価:{{ }}と.data