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

按ID为数据框每行计算累积中位数的R语言实现求助

按ID分组计算累积中位数的R语言实现

嘿,这个问题我帮你搞定!你需要按id分组,给每行计算到当前行为止的累积中位数对吧?我来给你一步步实现。

输入数据

首先先确认你的输入数据:

df <- data.frame(
  id = c(1,2,3,3,3,4,4,4,4,4,4),
  value = c(956, 986, 995, 995, 986, 700, 600, 995, 956, 1000, 986)
)

解决方案

我们可以用dplyr做分组处理,再配合自定义的累积中位数函数来实现需求。这里提供两种写法,效果完全一致:

方法1:使用dplyr + purrr

library(dplyr)
library(purrr)

# 定义累积中位数函数:计算从第1个元素到当前元素的中位数
cum_median <- function(x) {
  map_dbl(seq_along(x), ~median(x[1:.x]))
}

# 处理数据并转换为字符类型(匹配期望结果格式)
result_df <- df %>%
  group_by(id) %>%
  mutate(median = cum_median(value)) %>%
  ungroup() %>%
  mutate(across(c(id, value, median), as.character))

# 查看结果
print(result_df)

方法2:使用dplyr + 基础R

如果你不想加载额外包,用基础R的sapply也能实现:

library(dplyr)

# 基础R版本的累积中位数函数
cum_median_base <- function(x) {
  sapply(1:length(x), function(i) median(x[1:i]))
}

result_df_base <- df %>%
  group_by(id) %>%
  mutate(median = cum_median_base(value)) %>%
  ungroup() %>%
  mutate(across(c(id, value, median), as.character))

结果验证

运行后得到的结果和你期望的完全一致:

# A tibble: 11 × 3
   id    value median
   <chr> <chr> <chr> 
 1 1     956   956   
 2 2     986   986   
 3 3     995   995   
 4 3     995   995   
 5 3     986   995   
 6 4     700   700   
 7 4     600   650   
 8 4     995   700   
 9 4     956   828   
10 4     1000  956   
11 4     986   971   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:32:18