标记事件的第一个实例,该事件发生在其他变量的值上

时间:2015-11-19 06:21:33

标签: r indexing data.table

R的新手并解决下面的问题,因此不确定在特定情况下如何实现某些功能。

我有一个数据框:

df <- data.frame(DATETIME = seq(from = as.POSIXct('2014-01-01 00:00', tz = "GMT"), to = as.POSIXct('2014-01-01 06:00', tz = "GMT"), by='15 mins'),
                 Price = c(23,22,23,24,27,31,33,34,31,26,24,23,19,18,19,19,23,25,26,26,27,30,26,25,24),
                 TroughPriceFlag = c(0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0))
df <- data.table(df)

df
               DATETIME Price TroughPriceFlag
 1: 2014-01-01 00:00:00    23           0
 2: 2014-01-01 00:15:00    22           1
 3: 2014-01-01 00:30:00    23           0
 4: 2014-01-01 00:45:00    24           0
 5: 2014-01-01 01:00:00    27           0
 6: 2014-01-01 01:15:00    31           0
 7: 2014-01-01 01:30:00    33           0
 8: 2014-01-01 01:45:00    34           0
 9: 2014-01-01 02:00:00    31           0
10: 2014-01-01 02:15:00    26           0
11: 2014-01-01 02:30:00    24           0
12: 2014-01-01 02:45:00    23           0
13: 2014-01-01 03:00:00    19           0
14: 2014-01-01 03:15:00    18           1
15: 2014-01-01 03:30:00    19           0
16: 2014-01-01 03:45:00    19           0
17: 2014-01-01 04:00:00    23           0
18: 2014-01-01 04:15:00    25           0
19: 2014-01-01 04:30:00    26           0
20: 2014-01-01 04:45:00    26           0
21: 2014-01-01 05:00:00    27           0
22: 2014-01-01 05:15:00    30           0
23: 2014-01-01 05:30:00    26           0
24: 2014-01-01 05:45:00    25           0
25: 2014-01-01 06:00:00    24           0

我想做的是两件事:

(1)从我们观察TroughPrice的地方,标记价格上涨10美元或更多美元的第一个实例。也就是说,找到自波谷价格以来deltaPrice&gt; = 10的第一个实例。

作为一个例子:从22的低谷价格(第2行),在下一个区间价格增加到23,这是1美元的变化,所以没有标志。从22的低谷价格(再次排第2,因为总是参考有问题的低谷价格),两个区间后来的价格是24美元,所以价格从低谷以来增加了2美元,所以再没有标志。然而,从22,5的低谷价格后来价格已经增加到33美元,这是11美元的增加,这是价格首次超过10美元。因此该标志为1。

(2)确定低谷价格和第一次价格上涨10美元或更多美元之间经过的15分钟时段。

结果数据框应如下所示:

              DATETIME Price TroughPriceFlag FirstOver10CentsFlag CountPeriods
1  2014-01-01 00:00:00    23           0                    0           NA
2  2014-01-01 00:15:00    22           1                    0            5
3  2014-01-01 00:30:00    23           0                    0           NA
4  2014-01-01 00:45:00    24           0                    0           NA
5  2014-01-01 01:00:00    27           0                    0           NA
6  2014-01-01 01:15:00    31           0                    0           NA
7  2014-01-01 01:30:00    33           0                    1           NA
8  2014-01-01 01:45:00    34           0                    0           NA
9  2014-01-01 02:00:00    31           0                    0           NA
10 2014-01-01 02:15:00    26           0                    0           NA
11 2014-01-01 02:30:00    24           0                    0           NA
12 2014-01-01 02:45:00    23           0                    0           NA
13 2014-01-01 03:00:00    19           0                    0           NA
14 2014-01-01 03:15:00    18           1                    0            8
15 2014-01-01 03:30:00    19           0                    0           NA
16 2014-01-01 03:45:00    19           0                    0           NA
17 2014-01-01 04:00:00    23           0                    0           NA
18 2014-01-01 04:15:00    25           0                    0           NA
19 2014-01-01 04:30:00    26           0                    0           NA
20 2014-01-01 04:45:00    26           0                    0           NA
21 2014-01-01 05:00:00    27           0                    0           NA
22 2014-01-01 05:15:00    30           0                    1           NA
23 2014-01-01 05:30:00    26           0                    0           NA
24 2014-01-01 05:45:00    25           0                    0           NA
25 2014-01-01 06:00:00    24           0                    0           NA

我不确定从哪里开始,因为时间差距可能非常大,而且我只在向前/向后几步的情况下使用索引。请帮忙!

提前致谢

1 个答案:

答案 0 :(得分:3)

您可以使用data.table包进行连锁操作,我们的想法是按cumsum的{​​{1}}进行分组:

ThroughPriceFlag