如何在R中优雅计算数据框按S、G分组的中位数与IQR
问题与解决方案
问题
现有R数据框df定义如下:
df <- data.frame( S = c("a","a","a","a","a", "b","b","b","b","b","a","a"), R = c("10","15","20","30","30","30","30","30","30","30","15","20"), G = c("A","B","B","B","B","B","B","A","A","A","A","A"))
需要便捷优雅地获取:
S=="a"且G=="A"时,R的中位数与IQRS和G所有其他组合下,R的中位数与IQR
解决步骤
1. 修正数据类型
首先注意R列是字符格式,必须先转为数值型才能计算统计量:
df$R <- as.numeric(df$R)
2. 分组计算所有组合的统计量(推荐方式)
用dplyr包的分组汇总功能,代码简洁直观,能一次性得到所有组合的结果:
library(dplyr) # 分组计算中位数和IQR summary_stats <- df %>% group_by(S, G) %>% summarise( median_R = median(R), iqr_R = IQR(R), .groups = "drop" # 取消分组状态,返回普通数据框 ) # 查看结果 summary_stats
运行后会输出每个(S,G)组合的统计值,其中S="a"且G="A"的结果会单独列出来,其他组合也一并呈现。
3. 无额外包的base R实现
如果不想加载dplyr,用base R的aggregate函数也能实现需求:
# 按S和G分组计算 base_stats <- aggregate(R ~ S + G, data = df, FUN = function(x) c(median = median(x), iqr = IQR(x))) # 整理成易读的数据框格式 base_stats <- do.call(data.frame, base_stats) # 查看结果 base_stats
4. 单独提取目标组结果
如果只需要S="a"且G="A"的结果,直接从汇总结果中筛选即可:
# dplyr方式筛选 target_group <- summary_stats %>% filter(S == "a", G == "A") # base R方式筛选 target_group_base <- base_stats[base_stats$S == "a" & base_stats$G == "A", ]
内容的提问来源于stack exchange,提问作者吳海濱
相关产品推荐
相关产品推荐

