R data.table中使用shift/lead访问全部前置行值的实现方法咨询
R data.table访问全量前置/后置行的实现方案
完全可以实现该需求,以下是3种不同场景下的可行方案:
方案1:行索引 .I 子集提取(通用场景)
适合需要拿到所有前置行值组成列表的需求,无需额外依赖:
library(data.table) dt <- data.table(mtcars)[, .(cyl, gear, mpg)] # 全局取所有前置行的mpg值列表 dt[, pre_mpg_list := .(list(mpg[seq_len(.I - 1)])), by = 1:nrow(dt)] # 按cyl分组后,取同组内当前行之前的mpg值列表 dt[, pre_mpg_list_by_cyl := .(list(mpg[seq_len(.I - 1)])), by = cyl] # 取所有后置行的值列表,修改索引范围即可 dt[, post_mpg_list := .(list(mpg[(.I + 1):.N])), by = 1:nrow(dt)]
方案2:内置累积函数(聚合类需求)
如果你的需求是累积求和、求均值等可向量化的聚合操作,直接用data.table内置的累积函数性能最高,效率远高于循环提取列表再计算:
# 计算全局前置行mpg的累积均值(排除当前行,首行无前置行返回NA属于正常情况 dt[, pre_mpg_mean := cumsum(shift(mpg, fill = 0)) / (1:.N - 1)] # 计算同组内前置行mpg的累积和 dt[, pre_mpg_cumsum := cumsum(shift(mpg, fill = 0)), by = cyl]
方案3:滑动窗口函数frollapply(自定义计算需求)
data.table 1.12.0及以上版本内置的froll系列函数支持自定义滑动窗口逻辑,适合需要对前置行做自定义运算的场景:
# 对所有前置行做自定义计算,窗口大小设置为当前行号即可 dt[, pre_mpg_custom := frollapply(mpg, n = 1:.N, FUN = function(x) { # x默认包含当前行,去掉最后一位就是所有前置行的值 mean(x[-length(x)], na.rm = TRUE) })]
注:你提到的
shift函数仅支持取固定偏移行数的取值是准确的,要获取全部前置/后置行使用上述方案即可适配。
内容的提问来源于stack exchange,提问作者R007
相关产品推荐
相关产品推荐

