如何计算不同分组下的计数均值(R语言场景)
问题描述
我觉得要实现的功能很简单,但一直搞不定。我有一列叫Random_ID,存的是参与者编码,总共16名参与者,分布在4所以School_ID标识的学校里。我的目标是计算每所学校的参与者人数(本例中每所学校结果都是4),并且要把方法推广到更大规模的参与者和学校数据中。求可行的解决办法。
示例数据
(df <- data.frame( Random_ID = c("A1", "A2", "A3", "A4", "A5", "A6","A7", "A8", "A9", "10", "A11", "A12", "A13", "A14", "A15", "A16"), School_ID = c("1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4", "1", "2", "3", "4") ))
运行后输出:
Random_ID School_ID 1 A1 1 2 A2 2 3 A3 3 4 A4 4 5 A5 1 6 A6 2 7 A7 3 8 A8 4 9 A9 1 10 10 2 11 A11 3 12 A12 4 13 A13 1 14 A14 2 15 A15 3 16 A16 4
解决方法
以下几种方法都能轻松推广到大规模数据集,根据你的数据量级和使用习惯选择即可:
方法一:Base R 原生方法
不需要额外安装包,直接用R自带函数就能搞定:
- 用
table()统计分组人数,还能直接算均值:
# 统计每所学校的参与者人数 school_counts <- table(df$School_ID) # 转成数据框查看明细 as.data.frame(school_counts) # 计算各学校人数的均值 mean(school_counts)
输出结果:
Var1 Freq 1 1 4 2 2 4 3 3 4 4 4 4 [1] 4
- 用
aggregate()直接按分组统计:
aggregate(Random_ID ~ School_ID, data = df, FUN = length)
输出结果:
School_ID Random_ID 1 1 4 2 2 4 3 3 4 4 4 4
方法二:dplyr 包(tidyverse 生态)
dplyr是数据分析常用的工具包,语法直观易懂,处理大规模数据时性能稳定:
library(dplyr) # 统计每校人数,如需计算均值再加一行即可 df %>% group_by(School_ID) %>% summarise(participant_count = n()) %>% # 可选:计算所有学校的参与者人数均值 summarise(mean_count = mean(participant_count))
输出结果:
# A tibble: 1 × 1 mean_count <dbl> 1 4
如果只需要每所学校的人数,去掉最后一行summarise(mean_count = mean(participant_count))就行。
方法三:data.table 包(超大规模数据首选)
如果你的数据量达到百万甚至千万级,data.table的速度和内存效率优势会很明显:
library(data.table) # 将数据框转为data.table格式 dt <- as.data.table(df) # 统计每校人数 dt[, .(participant_count = .N), by = School_ID] # 计算各学校人数的均值 dt[, .(mean_count = mean(.N)), by = School_ID][, mean(mean_count)]
输出结果:
School_ID participant_count 1: 1 4 2: 2 4 3: 3 4 4: 4 4 [1] 4
内容的提问来源于stack exchange,提问作者Stats Iliterate
相关产品推荐
相关产品推荐

