如何用dplyr优雅计算数据框中n个前导值的求和?
优雅计算n个前导值的和
当然有更优雅的方法!手动叠加多个lead()确实不够灵活,尤其是当n变大的时候。下面给你几种简洁的实现方式,适配不同的场景:
首先先确认我们的示例数据:
library(tibble) data <- tibble(a = 1:100)
方法1:结合dplyr与purrr实现通用型计算
这种方法不需要额外安装新包,利用purrr::map_dbl()遍历每一行,动态提取对应位置的前导值并求和:
library(dplyr) library(purrr) n <- 2 # 你可以随时修改这个值 data <- data %>% mutate( b = map_dbl(row_number(), ~ sum(lead(a, 1:n)[.x], na.rm = FALSE)) )
- 逻辑说明:
row_number()定位当前行,lead(a, 1:n)生成包含前1到n位的前导值矩阵,然后提取对应行的元素求和; na.rm = FALSE确保当后续不足n个值时返回NA,符合预期逻辑。
方法2:用slider包实现滑动窗口(最简洁)
slider包专门用于处理滑动窗口类的计算,语法非常直观:
library(slider) n <- 2 data <- data %>% mutate( b = slide_dbl(a, ~sum(.x), .before = -1, .after = n - 1) )
- 逻辑说明:
.before = -1表示不包含当前行,.after = n - 1表示包含当前行之后的n-1个元素,两者结合正好取到当前行之后的n个元素求和; - 这种方式代码最简洁,且性能优异,适合处理大数据集。
方法3:base R + zoo包的滚动求和
如果你习惯用base R风格,也可以通过反转向量配合滚动求和实现:
library(zoo) n <- 2 data$b <- rev(rollsum(rev(data$a), n, fill = NA))
- 逻辑说明:先反转
a向量,用rollsum()计算连续n个值的和,再反转回来,就得到了原向量中每个位置之后n个值的和; fill = NA会自动为末尾不足n个值的行填充NA。
验证一下n=2的场景,第一行的b会是2+3=5,第二行是3+4=7,完全符合你预期的结果。
内容的提问来源于stack exchange,提问作者mrmajacuze
相关产品推荐
相关产品推荐

