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

R语言如何按列计算分组中位数差值并新增结果行?

问题描述

我有如下data.frame类型数据df1:

set.seed(12345)
df1 <- data.frame(group=c(rep("apple", 4), rep("pear",6)), a=rnorm(10,0,0.4), 
      b=rnorm(10,0,0.2), 
      c=rnorm(10,0,0.7), d=rnorm(10,0,0.9), e=rnorm(10,0,0.5))

需要按列计算apple分组(第1-4行)和pear分组(第5-10行)的中位数差值,将该差值作为新行添加到数据框底部,最终得到如下结构的df2:

> df2
    group          a           b          c           d          e
1  apple  0.23421153 -0.02324956  0.5457353  0.73068586  0.5642554
2  apple  0.28378641  0.36346241  1.0190496  1.97715019 -1.1901790
3  apple -0.04372133  0.07412557 -0.4510299  1.84427130 -0.5301328
4  apple -0.18139887  0.10404329 -1.0871962  1.46920108  0.4685703
5  pear   0.24235498 -0.15010640 -1.1183967  0.22884407  0.4272259
6  pear  -0.72718239  0.16337997  1.2635683  0.44206945  0.7303647
7  pear   0.25203942 -0.17727150 -0.3371532 -0.29167792 -0.7065494
8  pear  -0.11047364 -0.06631552  0.4342659 -1.49584522  0.2837016
9  pear  -0.11366390  0.22414253  0.4284864  1.59096047  0.2915938
10 pear  -0.36772880  0.05974474 -0.1136177  0.02322094 -0.6533994
11 median.dif  0.20731387  0.09236982 -0.1100817  1.5307037 -0.3184289
实现方案

方法1:基础R实现(无需安装第三方包)

# 分别计算两个分组各数值列的中位数
med_apple <- apply(df1[df1$group == "apple", -1], 2, median)
med_pear <- apply(df1[df1$group == "pear", -1], 2, median)
# 计算中位数差值(apple中位数 - pear中位数,和示例结果方向一致)
med_dif <- med_apple - med_pear
# 构造差值行并绑定到原数据框
df2 <- rbind(df1, data.frame(group = "median.dif", t(med_dif)))

方法2:dplyr实现(代码更简洁易读)

library(dplyr)

df2 <- df1 %>%
  # 计算各分组的列中位数
  group_by(group) %>%
  summarise(across(a:e, median), .groups = "drop") %>%
  # 生成差值行
  reframe(group = "median.dif", across(a:e, ~ .x[group == "apple"] - .x[group == "pear"])) %>%
  # 将差值行追加到原数据框底部
  bind_rows(df1, .)

两种方法运行后得到的df2完全符合需求。

内容的提问来源于stack exchange,提问作者Sylvia Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:45:02