R语言按课程、教育水平、性别聚合计数报错问题求助
问题:按课程、教育水平、性别分组生成计数汇总表
需求:对包含课程(A、B)、教育水平、性别的学生数据,生成按课程、教育水平、性别分组的计数汇总表,期望输出格式如下:
course edu-level gender sum_value A prim male <cnt> A prim female <cnt> A sec male <cnt> A sec female <cnt> ...
尝试使用R的aggregate函数实现时,因gender为factor类型报错:
Error in Summary.factor(1:2, na.rm = FALSE) : ‘sum’ not meaningful for factors
相关代码:
# 两门课程"A"和"B" module<-as.factor(c(rep("A",5), rep( "B",6))) # 各课程对应的性别 gender<-as.factor(c(rep("female",2), rep("male",3), rep("female",3), rep("male",3))) # 对应性别受教育水平:primary, secondary or tertiary edu<-as.factor(c("prim", "sec", "tert", "prim", "sec", "tert","prim", "sec", "tert","prim", "sec")) course<-data.frame(module, gender, edu) # 报错的代码 aggregate(course$gender, list(course$module, course$edu), sum)
解决方案
报错核心原因:直接对factor类型的gender列使用sum函数,而因子类型无法执行求和操作。我们需要统计每组的样本数量,而非对因子求和,以下是几种可行方法:
方法1:修正aggregate函数用法
方式A:用length统计每组行数
通过length函数直接计算每组的记录数,同时指定分组列和结果列名:
aggregate( x = list(sum_value = course$gender), by = list(course = course$module, edu_level = course$edu, gender = course$gender), FUN = length )
方式B:新增数值列后用sum求和
先新增一列全为1的数值列,再对该列求和实现计数:
course$count <- 1 # 新增计数辅助列 aggregate( x = list(sum_value = course$count), by = list(course = course$module, edu_level = course$edu, gender = course$gender), FUN = sum )
方法2:用dplyr包实现(更简洁)
借助dplyr的管道语法,代码可读性更强:
library(dplyr) course %>% group_by(module, edu, gender) %>% summarise(sum_value = n(), .groups = "drop") %>% # n()统计每组数量 rename(course = module, edu_level = edu) # 重命名列匹配期望格式
以上方法均能生成符合需求的分组计数表,输出列对应course、edu_level、gender、sum_value,每行展示对应分组的学生数量。
内容的提问来源于stack exchange,提问作者BenJ
相关产品推荐
相关产品推荐

