如何在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]
关键注意事项
- 必须先按
ITEM和Date排序,确保滑动窗口是时序窗口,避免跨时间或跨商品的错误计算。 frollapply的效率远低于data.table原生的froll系列函数(如frollmax、frollmean),非必要场景优先使用原生函数。
内容的提问来源于stack exchange,提问作者zainul abid
相关产品推荐
相关产品推荐

