r - 按组计算 dplyr 中具有先前值的字段
问题描述
我想使用 dplyr 使用它的先前值来计算一个字段。for 循环可以完成这项工作,但我想按不同的st组计算。我了解 mutate (lag or ave) 不能使用未初始化的字段。
df <- data.frame(st = rep(c('a','b', 'c'), each = 5),
z = rep(c(10,14,12), each = 5),
day = rep(1:5, 3),
GAI = rep(0:4, 3),
surfT = sample(1:15))
df %>%
group_by(st) %>%
mutate(soilT = lag(soilT, order_by = day) + (surfT - lag(soilT,
order_by = day))*0.24*exp(-z*0.017)*exp(-0.15*GAI))
或者
df %>%
group_by(st) %>%
mutate(soilT = ave(soilT, c(st), FUN=function(x) c(0, soilT + (surfT - soilT)))
*0.24*exp(-z*0.017)*exp(-0.15*GAI))
如何通过st组在 dplyr 中计算一个简单的 for 循环:
df$soilT <- 0
for (i in 2:dim(df)[1]){
df$soilT[i]=df$soilT[i-1] + (df$surfT[i] - df$soilT[i-1])
*0.24*exp(-z[i]*0.017)*exp(-0.15*GAI[i])
}
解决方案
我们可以使用accumulate
frompurrr
获取前一行的输出作为当前行的输入。
library(dplyr)
result <- df %>%
group_by(st) %>%
mutate(soilT = purrr::accumulate(2:n(),
~.x + (surfT[.y] - .x)*0.24*exp(-z[.y]*0.017)*exp(-0.15*GAI[.y]),
.init = 0))
推荐阅读
- html - 右侧边栏
- python - 将图像加载到 Keras 时如何处理“预期的 str、字节或 os.PathLike 对象,而不是 ImageFieldFile”?
- php - 如何更改 WooCommerce 客户注销端点 URL?
- python - 不使用字典理解
- java - 如何在 Spring Boot 的 OneToMany 关系中修复“无法执行语句;SQL [n/a];约束 [null]”
- python - Snakemake 中是否有可能具有“可选”通配符或文件名的一部分?
- ibm-cloud - Watson Studio 作业 API
- typescript - typescript import *d.ts only 而不是源代码 *.ts
- javascript - 在没有 div.class 的情况下在 JS 中更改按钮的文本
- ios - 如何在 swiftUI 中创建仅选择年份的 DatePicker,并且我希望它在预先指定的年份范围内?