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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:25:00