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
相关产品推荐
相关产品推荐

