R语言按条件计算行中位数的实现方法
R语言按指定分组条件计算行中位数实现方法
需求说明:按Col1、Col2两个字段的取值组合分组,对每一组的Col3值计算中位数,将结果填充到该组所有行的Median字段中。
首先构造示例数据集:
# 构建示例数据框 df <- data.frame( Col1 = c("A", "B", "A", "A", "B", "B"), Col2 = c("x", "x", "y", "y", "x", "x"), Col3 = c(1, 2, 2, 3, 2, 1) )
方法一:dplyr实现(代码可读性高,推荐日常使用)
加载dplyr包后按两个字段分组,直接在分组内调用mutate计算中位数即可,不需要手动逐行筛选匹配:
library(dplyr) df <- df %>% group_by(Col1, Col2) %>% # 按Col1、Col2的组合分组 mutate(Median = median(Col3)) %>% # 组内计算Col3中位数赋值给Median列 ungroup() # 取消分组状态,避免后续操作受分组影响
方法二:base R实现(无需安装第三方包)
直接使用R内置的ave分组计算函数即可,不需要额外依赖:
df$Median <- ave( x = df$Col3, # 要计算的目标列 df$Col1, df$Col2, # 分组依据字段 FUN = median # 指定计算函数为中位数 )
结果核对
两种方法运行后得到的结果完全一致:
- 分组
A+x共1条记录,Col3值为1,中位数为1 - 分组
A+y共2条记录,Col3值为2、3,中位数为2.5 - 分组
B+x共3条记录,Col3值为2、2、1,排序后为1、2、2,中位数为2
最终输出的数据集如下:
| Col1 | Col2 | Col3 | Median |
|---|---|---|---|
| A | x | 1 | 1.0 |
| B | x | 2 | 2.0 |
| A | y | 2 | 2.5 |
| A | y | 3 | 2.5 |
| B | x | 2 | 2.0 |
| B | x | 1 | 2.0 |
小提示:如果需要调整偶数样本量时的中位数取值规则,可以给
median函数传入type参数,比如median(Col3, type = 1)会在偶数样本时取较小的那个值,此时A+y分组的中位数会返回2。
内容的提问来源于stack exchange,提问作者Bahadır Ayan
相关产品推荐
相关产品推荐

