根据R中的滞后值和不同列中的值进行累加

问题描述 投票:0回答:1

我有以下数据集:

df <- data.frame(fractile = 1:10) %>% mutate(bracketaverage = fractile*100, topaverage = 10:19)

看起来像:

 fractile bracketaverage topaverage
1         1            100         10
2         2            200         11
3         3            300         12
4         4            400         13
5         5            500         14
6         6            600         15
7         7            700         16
8         8            800         17
9         9            900         18
10       10           1000         19

我希望根据指定的公式利用剩余列的输入来修改 topaverage 列:

topaverage = ( (100-lag(fractile) ) * lag(topaverage) + ( lag(fractile) - fractile ) * bracket_average ) / (100-fractile)

因此,该公式递归地计算顶部平均值,这意味着每次迭代都依赖于上一步的顶部平均值。

r purrr accumulate
1个回答
1
投票

虽然许多

purrr
的函数对于两个参数都有
func2
版本,但有两个因素使得它们在此处使用起来并不容易:您需要 三个 变量,并且至少需要 lag 和当前版本其中之一。因此,我认为我们可以
purrr::accumulate
遍历行索引本身。

library(dplyr)
library(purrr) # accumulate
df |>
  mutate(
    val = accumulate(
      row_number(), .init = first(topaverage),
      .f = function(ta, i) if (i == 1) ta else {
        ( (100 - fractile[i-1]) * topaverage[i-1] +
            (fractile[i-1] - fractile[i]) * bracketaverage[i] ) /
          (100 - fractile[i])
      })[-1]
  )
#    fractile bracketaverage topaverage       val
# 1         1            100         10 10.000000
# 2         2            200         11  8.061224
# 3         3            300         12  8.020619
# 4         4            400         13  7.958333
# 5         5            500         14  7.873684
# 6         6            600         15  7.765957
# 7         7            700         16  7.634409
# 8         8            800         17  7.478261
# 9         9            900         18  7.296703
# 10       10           1000         19  7.088889

其中

fractile[i-1]
给我们
lag(fractile)
fractile[i]
给我们当前行
fractile

我假设第一个

topaverage
保持不变。如果情况并非如此,则可能需要调整以适应另一个方向的对齐(
[i]
[i+1]
,而是更新前导条件)。

© www.soinside.com 2019 - 2024. All rights reserved.