按年份将数据框分十分位并计算各分位均值与中位数(R语言)
按年份对Category按value划分十分位并计算分组统计量
原始数据结构
df <- data.frame(Category = rep(LETTERS[1:15], each = 6), Year = rep(2010:2015, 15), value = runif(90, 50, 100))
需求
按年份分组,依据value字段将Category划分为十分位,计算每年每个十分位对应的value的均值与中位数,最终得到每行对应一个年份+十分位、包含两组统计量的数据集。
问题分析
你之前的十分位划分代码存在逻辑错误:没有按Year分组就调用ntile,导致生成的是全局范围内的十分位,而非每年独立划分的分组,这是后续计算不符合预期的核心原因。
正确实现方法
1. 使用dplyr完成全流程
library(dplyr) # 先按年份分组,再划分十分位 df_processed <- df %>% group_by(Year) %>% mutate(quantile = ntile(value, 10)) %>% ungroup() # 分组计算均值和中位数 result_dplyr <- df_processed %>% group_by(Year, quantile) %>% summarise( mean_value = mean(value, na.rm = TRUE), median_value = median(value, na.rm = TRUE), .groups = "drop" # 取消分组,输出整洁数据框 ) # 查看结果 head(result_dplyr)
2. 使用data.table完成全流程
library(data.table) # 转换为data.table格式 dt <- setDT(df) # 按年份划分十分位 dt[, quantile := ntile(value, 10), by = Year] # 分组计算均值和中位数 result_dt <- dt[, .(mean_value = mean(value, na.rm = TRUE), median_value = median(value, na.rm = TRUE)), by = .(Year, quantile)] # 查看结果 head(result_dt)
结果说明
两种方法生成的结果结构一致:每行对应一个Year和quantile组合,包含该分组下value的均值(mean_value)和中位数(median_value),完全符合需求。
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

