首页 > 解决方案 > 使用先前计算的结果在 dplyr 中进行迭代计算

问题描述

我希望使用以下逻辑对数据框中的字段执行计算:

假设第一个值永远不会是 NA 所以总会有一个种子值。我希望按数据组执行计算(dplyr::group_by)

以下代码给出了一个代表:

basevalue <- c(2,5,NA,NA,NA,NA)      
multiplier <- c(3.2,1.1,1.8,1.3,1.5,1.2)
previous_result <- c(NA,2,5,9,11.7,17.55)
result<- c(2,5,9,11.7,17.55,21.06)
logic <- c(rep("basevalue != NA, so take base value",2), rep("basevalue == NA, so take lag(result) * multiplier",4))

dfIn <- data.frame(basevalue,multiplier)
dfOut <- data.frame(basevalue,multiplier, result, previous_result, logic)

有没有办法使用简单的 dplyr / base R / tidyverse 逻辑来实现这一点,还是我需要使用诸如 zoo 之类的专业包?

标签: rdplyrtidyverse

解决方案


您可以使用accumulate2purrr 中的函数来执行此操作,该函数旨在将这种递归关系应用于两个向量。

library(dplyr)
library(purrr)

calculate <- function(previous, basevalue, multiplier) {
  coalesce(basevalue, multiplier * previous)
}

dfIn %>%
  mutate(lst = accumulate2(basevalue, multiplier[-1], calculate),
         result = unlist(lst))

两个注意事项:

  • multiplier[-1]丢弃第一个乘数值,因为预计accumulate它比第一个参数短一个(请注意,您永远不会使用第一个乘数值,因为此时没有“先前”值)。
  • 的结果accumulate2是一个列表,所以我们添加unlist()将它变成一个向量。

推荐阅读