我有以下数据集:
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)
因此,该公式递归地计算顶部平均值,这意味着每次迭代都依赖于上一步的顶部平均值。
虽然许多
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]
,而是更新前导条件)。