r - 使用先前计算的结果在 dplyr 中进行迭代计算
问题描述
我希望使用以下逻辑对数据框中的字段执行计算:
- 如果基值!= NA,则将基值分配给结果
- 如果基值 == NA,则取上一个结果,将其乘以乘数字段并将其作为结果输出。
假设第一个值永远不会是 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 之类的专业包?
解决方案
您可以使用accumulate2
purrr 中的函数来执行此操作,该函数旨在将这种递归关系应用于两个向量。
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()
将它变成一个向量。
推荐阅读
- google-app-engine - 将请求定向到 Google Cloud 上的实例
- c# - C# - 如何使用 HttpClient 对象从 JSON API 中提取 CSV 文件?
- python - 初学者寻求建议(Python)
- matlab - 如何从时间戳为字符串的时间序列数据导入时间表?
- strtok - 如何将标记传递给 strstr() 以搜索相似的字符串?
- r - 切换和 tabsetPanel 的闪亮命名空间问题
- python - pytest:重置单个文件之间的模拟
- java - 如何在没有罐子的情况下附加代理?
- api - string' 不是 'index' 的 'int' 类型的子类型,而将 api 数据提取到列表视图中。扑
- javascript - 如何从节点服务器向 Flask API 发出 GET 请求