如何按年龄区间分组统计Customer.Type与Type.Of.Travel类别数量
R按指定年龄区间分组统计分类字段计数实现方案
核心操作分为两步:先通过cut()函数将连续年龄值匹配到你定义的左闭右开年龄区间,再按分组维度对两个分类字段分别统计类别计数即可。
1. 年龄分箱预处理
你定义的6个年龄区间均为左闭右开规则(即[20,24)、[24,28)这类),直接调用R内置的cut()函数就能完成分箱,不需要额外安装包:
# 构造和描述匹配的7条样例测试数据 df <- data.frame( Age = c(22,26,30,33,38,41,44), Customer.Type = c("First-Time","Returning","Returning","First-Time","Returning","First-Time","Returning"), Type.Of.Travel = c("Personal","Bussiness","Bussiness","Personal","Bussiness","Personal","Bussiness") ) # 定义年龄区间断点 age_breaks <- c(20,24,28,32,36,40,44) # 新增年龄分组列,严格匹配左闭右开规则 df$age_group <- cut( x = df$Age, breaks = age_breaks, right = FALSE, # 该参数控制区间为左闭右开 labels = c("[20,24)","[24,28)","[28,32)","[32,36)","[36,40)","[40,44)") )
2. 分组统计类别数量
方法1:dplyr 写法(可读性更高)
library(dplyr) # 按年龄组分别统计两个分类字段的类别计数,输出宽表结果 stat_result <- df %>% group_by(age_group) %>% summarise( # 统计Customer.Type各类别数量 first_time_customer_num = sum(Customer.Type == "First-Time"), returning_customer_num = sum(Customer.Type == "Returning"), # 统计Type.Of.Travel各类别数量 business_travel_num = sum(Type.Of.Travel == "Bussiness"), personal_travel_num = sum(Type.Of.Travel == "Personal"), # 可选:统计每组总样本量 group_total = n() )
如果需要长格式的统计结果(每一行对应一个分组下的一个分类值+计数),可以用下面的写法:
long_stat <- df %>% group_by(age_group) %>% reframe( category = c("Customer.Type-First-Time", "Customer.Type-Returning", "Type.Of.Travel-Bussiness", "Type.Of.Travel-Personal"), count = c( sum(Customer.Type == "First-Time"), sum(Customer.Type == "Returning"), sum(Type.Of.Travel == "Bussiness"), sum(Type.Of.Travel == "Personal") ) )
方法2:base R 写法(无第三方包依赖)
不需要加载任何拓展包,直接用table()生成列联表即可:
# 生成分组下两个分类字段的计数表 customer_type_count <- as.data.frame.matrix(table(df$age_group, df$Customer.Type)) travel_type_count <- as.data.frame.matrix(table(df$age_group, df$Type.Of.Travel)) # 合并最终结果 final_stat <- cbind( age_group = rownames(customer_type_count), customer_type_count, travel_type_count )
注意:如果某个年龄区间内没有对应样本,统计结果中该组的所有分类计数会自动为0;如果需要把44-45岁的样本也纳入统计,只要把
age_breaks向量的最后一个值修改为45即可。
内容的提问来源于stack exchange,提问作者Riandi geek
相关产品推荐
相关产品推荐

