You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的中位数与IQR
  • S和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,提问作者吳海濱

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:16:27