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

如何在R的data.table中使用frollapply?自定义函数报错求助

问题分析与解决方案

报错原因

frollapply默认会将滑动窗口内的数据转换为矩阵(而非data.table对象),而自定义函数testFn中使用的.(...)是data.table的专用语法,矩阵环境下无法识别该函数,因此抛出could not find function "."错误。另外原代码未对面板数据按ITEM分组,滑动窗口会跨商品计算,不符合面板数据的时序分析逻辑(每个商品应独立计算滑动窗口)。


正确实现方式

方案1:使用data.table原生滑动函数(高效推荐)

如果需求是对每个商品(ITEM),计算过去26个时间窗口内QUANTITY_2的最大值,直接用data.table内置的frollmax函数即可,效率远高于frollapply:

library(data.table)
setDT(panel.merged)

# 先按商品和日期排序,保证时序窗口的正确性
setorder(panel.merged, ITEM, Date)

# 按ITEM分组,计算滑动窗口最大值
panel.merged[, variable.weeks := frollmax(QUANTITY_2, n = 26, align = "right", na.rm = TRUE), by = ITEM]
  • align="right"表示窗口以当前行为终点(计算过去26行的最大值)
  • na.rm=TRUE表示忽略窗口内的NA值,可根据需求调整

方案2:修正自定义函数适配frollapply

如果必须使用frollapply(比如需要更复杂的分组聚合逻辑),需修改自定义函数,先将窗口矩阵转换为data.table,同时按ITEM分组处理:

library(data.table)
setDT(panel.merged)
setorder(panel.merged, ITEM, Date)

# 重写自定义函数:先将窗口矩阵转为data.table,再执行分组聚合
testFn <- function(window_mat) {
  window_dt <- as.data.table(window_mat)
  # 在当前滑动窗口内,按指定列分组计算QUANTITY_2的最大值
  agg_result <- window_dt[, .(variable.weeks = max(QUANTITY_2, na.rm = TRUE)), 
                          by = c("ITEM", "Date", "QUANTITY", "MIN_PRICE", "saleflag")]
  # 返回窗口对应到当前行的结果(取窗口内最新日期的分组结果)
  return(agg_result[Date == max(window_dt$Date)])
}

# 按ITEM分组应用滑动窗口,指定FUN.VALUE定义返回值结构
panel <- panel.merged[, frollapply(.SD, 26, testFn, 
                                   FUN.VALUE = data.table(
                                     ITEM = character(),
                                     Date = as.Date(character()), # 根据你的Date类型调整
                                     QUANTITY = numeric(),
                                     MIN_PRICE = numeric(),
                                     saleflag = logical(),
                                     variable.weeks = numeric()
                                   )), by = ITEM]

关键注意事项

  1. 必须先按ITEM和Date排序,确保滑动窗口是时序窗口,避免跨时间或跨商品的错误计算。
  2. frollapply的效率远低于data.table原生的froll系列函数(如frollmax、frollmean),非必要场景优先使用原生函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:27:28