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

