如何用dplyr的across结合rollapply为所有变量计算移动平均?
报错原因与解决方案
报错原因
rollapply参数顺序错误:zoo::rollapply的标准调用格式是rollapply(data, width, FUN, ...),你把窗口大小3放在了第一个参数位置,漏掉了当前要处理的列数据(即~后的.),导致函数无法识别FUN参数,触发argument "FUN" is missing错误。- 列筛选范围不当:报错提到
date列,说明你的where(is.double)筛选规则把date列也纳入了计算范围——要么date列被误存储为double类型,要么你的筛选条件没有排除该列,而通常日期列不需要计算移动平均。
修改后的代码
方案一:排除date列,仅处理double类型列
df %>% as_tibble() %>% mutate(across(where(is.double) & !matches("date"), ~ zoo::rollapply(., width = 3, FUN = mean, align = 'right', fill = NA)))
方案二:直接指定A-Z列(明确目标列)
如果确定仅A到Z列需要计算移动平均,可直接指定列范围,避免误选其他列:
df %>% as_tibble() %>% mutate(across(A:Z, ~ zoo::rollapply(., width = 3, FUN = mean, align = 'right', fill = NA)))
补充说明
align='right'符合你需求的“包含t-2、t-1、t”的三期移动平均(窗口右端对齐,即每个结果对应t时刻)。fill=NA会为前两行(无法形成完整窗口的行)填充NA,符合时间序列计算的常规逻辑。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

