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

