如何在rollapply()中结合quantile()使用自定义函数
步骤1:重构函数,适配向量输入
重写函数使其直接接收数值向量,返回对应的分位数编号向量,同时处理窗口内值重复导致分位数断点重复的异常情况:
quantile_num_vec <- function(x, probs = c(0, 0.2, 0.4, 0.6, 0.8, 0.95, 1), na.rm = TRUE) { # 计算窗口内的分位数断点 breaks <- quantile(x, probs = probs, na.rm = na.rm) # 去重避免.bincode报错(比如窗口内所有值相同) breaks <- unique(breaks) # 极端情况处理:窗口内值全部相同,返回全1向量 if (length(breaks) < 2) { return(rep(1, length(x))) } # 分配分位数编号 .bincode(x, breaks = breaks, include.lowest = TRUE) }
步骤2:正确调用rollapply()
如果需要给每个数据点分配其所在滚动窗口内的分位数编号,使用以下代码:
# 给dat添加滚动分位数列 dat$rolling_quantiles <- rollapply( dat$results, width = 7, # 滚动窗口大小 FUN = quantile_num_vec, align = "right", # 窗口包含当前点及前6个数据 fill = NA, # 开头不足窗口大小的位置补NA na.rm = TRUE )
查看前10行验证结果:
head(dat, 10)
输出示例:
date player results rolling_quantiles 1 2023-01-01 A 1 NA 2 2023-01-01 B 1 NA 3 2023-01-02 A 100 NA 4 2023-01-02 B 100 NA 5 2023-01-03 A 40 NA 6 2023-01-03 B 30 NA 7 2023-01-04 A 94 5 8 2023-01-04 B 89 4 9 2023-01-05 A 16 1 10 2023-01-05 B 88 4
扩展:按player分组计算滚动分位数
如果需要按player分组,对每个玩家单独计算滚动分位数,可结合dplyr的分组功能:
dat_grouped <- dat |> group_by(player) |> group_modify(~ { .x$rolling_quantiles <- rollapply( .x$results, width = 7, FUN = quantile_num_vec, align = "right", fill = NA, na.rm = TRUE ) .x }) |> ungroup()
内容的提问来源于stack exchange,提问作者seansteele
相关产品推荐
相关产品推荐

