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

如何在R中为数据表添加连续5行中位数的Median_Rates列?

解决R中按分组计算连续5行滚动中位数的问题

嘿,我来帮你搞定这个需求!要给数据表新增Median_Rates列,显示每个ID下连续5行Rates的中位数,咱们可以用dplyr结合slider包来实现,代码简洁又直观。

步骤1:构造示例数据

首先咱们先把你提供的数据转换成R中的数据框:

library(tibble)

# 构造你给出的示例数据
df <- tibble(
  ID = c(rep(1, 10), rep(2, 3)),
  Dates = c(seq.Date(as.Date("2010-01-01"), as.Date("2010-01-10"), by = "day"),
            seq.Date(as.Date("2010-01-01"), as.Date("2010-01-03"), by = "day")),
  Rates = c(0, 0, 2, 2, 2, 1, 0, 0, 0, 0, 3, 3, 2)
)

步骤2:计算滚动中位数

根据你给出的示例,前5行的Median_Rates都是这5行的中位数2,说明咱们需要的是从当前行开始,包含后续4行的连续5行窗口的中位数。用slider包的slide_dbl函数可以轻松实现这个滚动计算,同时按ID分组确保每个ID独立计算:

library(dplyr)
library(slider)

# 计算分组后的滚动中位数
df_result <- df %>%
  group_by(ID) %>%
  # 窗口包含当前行及后面4行,不足5行时用现有数据计算中位数
  mutate(Median_Rates = slide_dbl(
    .x = Rates,
    .f = ~median(.x),
    .before = 0,  # 不包含当前行之前的行
    .after = 4,   # 包含当前行之后的4行
    .complete = FALSE  # 窗口不足5行时仍计算中位数,而非返回NA
  )) %>%
  ungroup()

# 查看结果
print(df_result)

运行这段代码后,你会得到和示例一致的结果:ID=1的前5行Median_Rates都是2,后续行则对应各自连续5行窗口的中位数。

备选方案:使用zoo包

如果你习惯用zoo包,也可以用rollmedian函数实现,效果类似:

library(dplyr)
library(zoo)

df_result <- df %>%
  group_by(ID) %>%
  # align="left"表示窗口从当前行开始向右取5行,fill=NA表示不足5行时返回NA
  mutate(Median_Rates = rollmedian(Rates, k = 5, fill = NA, align = "left")) %>%
  ungroup()

注意这个方案中,不足5行的位置(比如ID=2的3行)会返回NA,如果需要用现有行计算中位数,还是推荐用slider的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:07:15