【发布时间】:2021-06-21 13:08:53
【问题描述】:
名为 crass 的数据集看起来像 -
> dput(crass)
structure(list(WT_TRADE_PRICE = c(3801, 3801, 3801, 3797, 3797,
3796.2125, 3800, 3797, 3795.09523809524, 3794, 3793, 3793, 3793.8,
3794.72, 3793.02777777778, 3789, 3790, 3788, 3788, 3788), min = c(3801,
3801, 3801, 3797, 3797, 3795, 3800, 3797, 3794, 3794, 3793, 3793,
3793, 3794, 3790, 3789, 3790, 3788, 3788, 3788), max = c(3801,
3801, 3801, 3797, 3797, 3800, 3800, 3797, 3797, 3794, 3793, 3793,
3794, 3797, 3794, 3789, 3790, 3788, 3788, 3788), Bid = c(3801,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA), Ask = c(3802, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -20L
), class = c("tbl_df", "tbl", "data.frame"))
# A tibble: 20 x 5
WT_TRADE_PRICE min max Bid Ask
<dbl> <dbl> <dbl> <dbl> <dbl>
1 3801 3801 3801 3801 3802
2 3801 3801 3801 NA NA
3 3801 3801 3801 NA NA
4 3797 3797 3797 NA NA
5 3797 3797 3797 NA NA
6 3796. 3795 3800 NA NA
7 3800 3800 3800 NA NA
8 3797 3797 3797 NA NA
9 3795. 3794 3797 NA NA
10 3794 3794 3794 NA NA
11 3793 3793 3793 NA NA
12 3793 3793 3793 NA NA
13 3794. 3793 3794 NA NA
14 3795. 3794 3797 NA NA
15 3793. 3790 3794 NA NA
16 3789 3789 3789 NA NA
17 3790 3790 3790 NA NA
18 3788 3788 3788 NA NA
19 3788 3788 3788 NA NA
20 3788 3788 3788 NA NA
可以看出,ask & bid 两个变量只有初始值,需要使用以下逻辑迭代填充。
- 如果
WT_TRDAE_PRICE是>=比Ask的先前值ORWT_TRADE_PRICE将检查>是否比先前bid和ask的平均值-然后当前ask将设置为等于当前行max变量,bid将设置为等于先前的bid值。 - 否则,当前的
ask将设置为之前的ask值和bid设置为max。
伪代码-
if(WT_TRADE_PRICE >= L(Ask) | WT_TRADE_PRICE > (L(Bid)+L(Ask))/2)
{
Bid = L(Bid), Ask = max
}
else
{
Bid = min, Ask = L(Ask)
}
最终输出 -
| SNo. | WT_TRADE_PRICE | min | max | Bid | Ask |
|---|---|---|---|---|---|
| 1 | 3801 | 3801 | 3801 | 3801 | 3802 |
| 2 | 3801 | 3801 | 3801 | 3801 | 3802 |
| 3 | 3801 | 3801 | 3801 | 3801 | 3802 |
| 4 | 3797 | 3797 | 3797 | 3797 | 3802 |
| 5 | 3797 | 3797 | 3797 | 3797 | 3802 |
| 6 | 3796. | 3795 | 3800 | 3795 | 3802 |
| 7 | 3800 | 3800 | 3800 | 3795 | 3800 |
| 8 | 3797 | 3797 | 3797 | 3797 | 3800 |
| 9 | 3795. | 3794 | 3797 | 3794 | 3800 |
| 10 | 3794 | 3794 | 3794 | 3794 | 3800 |
| 11 | 3793 | 3793 | 3793 | 3793 | 3800 |
| 12 | 3793 | 3793 | 3793 | 3793 | 3800 |
| 13 | 3794. | 3793 | 3794 | 3793 | 3800 |
| 14 | 3795. | 3794 | 3797 | 3793 | 3797 |
| 15 | 3793. | 3790 | 3794 | 3790 | 3797 |
| 16 | 3789 | 3789 | 3789 | 3789 | 3797 |
| 17 | 3790 | 3790 | 3790 | 3790 | 3797 |
| 18 | 3788 | 3788 | 3788 | 3788 | 3797 |
| 19 | 3788 | 3788 | 3788 | 3788 | 3797 |
| 20 | 3788 | 3788 | 3788 | 3788 | 3797 |
【问题讨论】:
-
我认为你的输入 dput 和表输入值是不同的。你能纠正吗
-
crass %>% mutate(Bid = min, Prev_Bid = lag(Bid))这给出了预期的输出。可能是一个更好的例子会让它更清楚 -
简化您的条件
-
@akrun,在您的空闲时间请看这个问题。由于
accumulate2最多可以处理两个变量,因此我将三个变量分别转换为一行小标题,并使用accumulate生成两个同时变量。但我相信您可以在需要将超过 2 个变量传递到accumulate的情况下提供一些替代策略,因为我们没有paccumulate有点东西 -
@AnilGoyal 我会使用
for循环,因为它具有更大的灵活性
标签: r dplyr iteration rolling-computation accumulate