R语言使用dplyr实现数据列递归逐行计算的方法
dplyr 生态下递归列计算方案
普通mutate搭配lag()无法实现这个需求,因为常规向量化运算只会读取列的初始值,不会逐行引用上一步刚生成的计算结果。你可以直接用tidyverse自带的purrr::accumulate()实现递推逻辑,和现有dplyr管线完全兼容,代码如下:
library(dplyr, warn.conflicts = FALSE) library(purrr) mtcars %>% as_tibble() %>% select(mpg, qsec) %>% head(5) %>% mutate( new_col = accumulate( # 传入从第二行开始的每行 mpg + qsec 计算值 .x = mpg[-1] + qsec[-1], # 递推规则:当前行总和 - 上一行new_col值 .f = \(prev_new_col, current_sum) current_sum - prev_new_col, # 指定第一行new_col的初始值 .init = 10 ) )
运行后输出完全匹配你的预期结果:
#> # A tibble: 5 × 3 #> mpg qsec new_col #> <dbl> <dbl> <dbl> #> 1 21 16.5 10 #> 2 21 17.0 28 #> 3 22.8 18.6 13.4 #> 4 21.4 19.4 27.4 #> 5 18.7 17.0 8.3
逻辑说明
accumulate会按顺序遍历输入向量,每一步的计算结果会自动作为下一步计算的第一个参数传入,天然适配逐行依赖上一行计算值的递归场景.init = 10对应第一行固定的new_col初始值- 输入向量
mpg[-1] + qsec[-1]是从第二行开始的每行mpg与qsec的和,递推时直接用这个和减去上一步算出的new_col,就得到当前行的new_col值 - 如果使用R 4.1以下版本,把函数简写
\()替换为标准写法function()即可正常运行
内容的提问来源于stack exchange,提问作者jyjek
相关产品推荐
相关产品推荐

