R语言中如何使用group by分组计算百分位数?
问题原因
你的代码存在两个核心问题:
- 使用
group_by(逻辑条件)会同时生成条件成立(TRUE)、**条件不成立(FALSE)**两个分组的统计结果,两次运行时如果你都误取了FALSE组的结果,就会出现统计值完全相同的情况(两个FALSE组对应都是结果为FALSE的同一批样本)。 - 你仅需要计算取值为TRUE的样本统计量,不需要分组操作,直接筛选符合条件的行再计算即可,逻辑更简洁不易出错。
修正方案
方案1:保留dplyr语法
library(dplyr) # 计算result_2010为TRUE的统计量 stat_2010 <- DT1 %>% filter(result_2010 == "TRUE") %>% summarise( "10.quantile" = round(quantile(years, 0.1), digits = 1), "25.quantile" = round(quantile(years, 0.25), digits = 1), "Median" = round(quantile(years, 0.5), digits = 1), "75.quantile" = round(quantile(years, 0.75), digits = 1), "90.quantile" = round(quantile(years, 0.9), digits = 1), "Mean" = round(mean(years), digits = 1) ) # 计算result_2011为TRUE的统计量 stat_2011 <- DT1 %>% filter(result_2011 == "TRUE") %>% summarise( "10.quantile" = round(quantile(years, 0.1), digits = 1), "25.quantile" = round(quantile(years, 0.25), digits = 1), "Median" = round(quantile(years, 0.5), digits = 1), "75.quantile" = round(quantile(years, 0.75), digits = 1), "90.quantile" = round(quantile(years, 0.9), digits = 1), "Mean" = round(mean(years), digits = 1) )
方案2:纯data.table语法(效率更高,适合大数据量)
# 计算result_2010为TRUE的统计量 stat_2010 <- DT1[result_2010 == "TRUE", .( "10.quantile" = round(quantile(years, 0.1), 1), "25.quantile" = round(quantile(years, 0.25), 1), "Median" = round(quantile(years, 0.5), 1), "75.quantile" = round(quantile(years, 0.75), 1), "90.quantile" = round(quantile(years, 0.9), 1), "Mean" = round(mean(years), 1) )] # 计算result_2011为TRUE的统计量 stat_2011 <- DT1[result_2011 == "TRUE", .( "10.quantile" = round(quantile(years, 0.1), 1), "25.quantile" = round(quantile(years, 0.25), 1), "Median" = round(quantile(years, 0.5), 1), "75.quantile" = round(quantile(years, 0.75), 1), "90.quantile" = round(quantile(years, 0.9), 1), "Mean" = round(mean(years), 1) )]
可选优化:一次计算所有年份的统计结果
如果后续有更多result_年份字段,可转换为长表一次计算,避免重复写代码:
library(data.table) stat_all <- melt(DT1, measure.vars = patterns("^result_"))[value == "TRUE", .( "10.quantile" = round(quantile(years, 0.1), 1), "25.quantile" = round(quantile(years, 0.25), 1), "Median" = round(quantile(years, 0.5), 1), "75.quantile" = round(quantile(years, 0.75), 1), "90.quantile" = round(quantile(years, 0.9), 1), "Mean" = round(mean(years), 1) ), by = variable]
输出结果中variable列会区分对应的年份字段,所有统计值合并在同一张表中。
内容的提问来源于stack exchange,提问作者Besz15
相关产品推荐
相关产品推荐

