r - 如何在 dplyr 中计算迭代的逐行函数(例如增长率)>
问题描述
我很尴尬,我似乎无法弄清楚这一点。给定一列级别和一列增长率,我想计算新级别。对于第 3 行,此值为 lag(level)*(1+pchange)。我尝试过的每个函数都只会为第 3 行生成一个值。
如果有人对如何做到这一点有想法,我将不胜感激。
df <- structure(list(obs = 1:9, level = structure(c(242082.4, 241954.139694373,
NA, NA, NA, NA, NA, NA, NA), .Dim = c(9L, 1L)), pchange = c(NA,
NA, -0.210448040080465, -0.000210098220356602, -0.0181173124932753,
0.026797769617468, 0.0550078908432114, 0.0477175804376899, 0.0166852340657672
),
expected_output = c(242082.4, 241954.1, 191035.3339, 190995.1977,
187534.878, 192560.3945, 203152.7356, 212846.6926, 216398.0895)),
class = "data.frame", row.names = c(NA, -9L))
解决方案
我们可以使用accumulate
library(purrr)
library(dplyr)
df %>%
mutate(new = coalesce(level, replace(pchange, 3:n(),
accumulate(pchange[-c(1:2)], ~ (1 + .y) * .x, .init = level[2])[-1])))
#. obs level pchange expected_output new
#1 1 242082.4 NA 242082.4 242082.4
#2 2 241954.1 NA 241954.1 241954.1
#3 3 NA -0.2104480401 191035.3 191035.4
#4 4 NA -0.0002100982 190995.2 190995.2
#5 5 NA -0.0181173125 187534.9 187534.9
#6 6 NA 0.0267977696 192560.4 192560.4
#7 7 NA 0.0550078908 203152.7 203152.8
#8 8 NA 0.0477175804 212846.7 212846.7
#9 9 NA 0.0166852341 216398.1 216398.1
或使用Reduce
frombase R
c(df$level[1], Reduce(function(x, y) (1 + y) * x, df$pchange[-c(1:2)], init = df$level[2], accumulate = TRUE))
#[1] 242082.4 241954.1 191035.4 190995.2 187534.9 192560.4 203152.8 212846.7 216398.1
推荐阅读
- monads - Scala Cats:用于任务 [Validated[String,?] 的 Monad 实例的尾递归 tailRecM 方法
- python - Django Microsoft Office 365 登录
- python - 如何在找到值后立即跳过对索引的字符串搜索?Python
- jquery - 条带结帐数据量动态
- python - Python 看不到模块中的文件
- c# - 使用 EFCore 时尝试在 Where() 子句中使用表达式树时出错
- arrays - 将过滤后的数组映射到仅具有属性子集的新数组
- php - 有没有办法在 Eloquent 的同一个查询中使用相同的参数到多个位置?
- c# - 如何避免使用 Dapper.Contrib 在后续更新调用中更新列?
- vhdl - 修复 Vivado 测试台添加/子错误 (VHDL)?