基于条件聚合统计DataTable列:按treaty分组计算性别占比与平均年龄
使用data.table实现分组聚合计算
原始数据
df <- structure(list(treaty = c("abc", "de", "abc", "de", "de"), SEX1 = c("M", "F", "F", "M", "F"), age = c(20, 30, 40, 50, 70)), class = "data.frame", row.names = c(NA, -5L))
需求
- 按
treaty字段分组 - 计算每组中M、F的占比(以组内总数量为基数,输出分数格式)
- 计算每组的平均年龄
- 输出指定格式的结果:
| treaty | Prop (M) | Prop (F) | Avg Age |
|---|---|---|---|
| abc | 1/2 | 1/2 | 30 |
| de | 1/3 | 2/3 | 50 |
解决方案
使用data.table包实现大数据量下的高效分组计算,代码如下:
library(data.table) # 转换为data.table对象 dt <- as.data.table(df) # 分组聚合并整理结果 result <- dt[, .( total = .N, count_M = sum(SEX1 == "M"), count_F = sum(SEX1 == "F"), avg_age = mean(age) ), by = treaty][, .( treaty, `Prop (M)` = paste(count_M, total, sep = "/"), `Prop (F)` = paste(count_F, total, sep = "/"), `Avg Age` = avg_age )] # 查看最终结果 print(result)
代码说明
as.data.table(df):将普通data.frame转为data.table,适配大数据量操作by = treaty:指定按treaty字段分组.N:直接获取每组的总行数(组内总样本量)sum(SEX1 == "M"):统计每组中男性的数量,同理统计女性数量mean(age):计算每组的平均年龄- 二次索引
[, .(...)]:将统计出的数量转换为分数格式字符串,同时整理成需求的列结构
输出结果
运行代码后将得到如下结果:
treaty Prop (M) Prop (F) Avg Age 1: abc 1/2 1/2 30 2: de 1/3 2/3 50
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

