data.table::frollapply处理列表列行为不符预期的技术问题
问题原因排查
- 滑动逻辑不符预期:
frollapply默认将滑动窗口内的每个独立列表元素单独传入自定义函数,而非合并窗口内所有列表的元素后统一处理,这与你需要的"合并窗口内所有列表计算唯一值"逻辑冲突。 - 输出类型错误:若自定义函数仅处理单个列表,
frollapply会将窗口内每个列表的处理结果打包为列表返回,最终导致输出列是列表类型而非单个数值。
解决办法
1. 修正自定义函数
让函数接收滑动窗口内的所有列表(即一个包含多个列表的列表),先合并所有元素,再计算去重后的数值数量(按需排除NA)。
2. 正确调用 frollapply
指定窗口长度 n=2,确保函数正确处理输入的窗口列表。
完整示例代码
library(data.table) # 构造测试数据 dt <- data.table( target_var = list( c(1, NA, 3), c(3, 4, NA), c(4, 5, 5), c(NA, NA, 6) ) ) # 自定义函数:合并窗口内所有列表,计算非NA唯一值数量 count_unique <- function(window_list) { combined <- unlist(window_list) length(unique(combined[!is.na(combined)])) } # 生成结果,fill=NA补充窗口不完整的行 dt[, new_var := frollapply(target_var, n=2, FUN=count_unique, fill=NA)] # 查看输出 print(dt)
预期输出
target_var new_var 1: 1, NA, 3 NA 2: 3, 4, NA 3 3: 4, 5, 5 3 4: NA, NA, 6 3
额外说明
- 若需将NA计入唯一值,删除代码中的
[!is.na(combined)]即可。 align参数可调整窗口对齐方式:align="left"结果对应窗口首行,align="center"对应窗口中间行,按需选择。
内容的提问来源于stack exchange,提问作者MoltenLight
相关产品推荐
相关产品推荐

