【发布时间】:2021-07-22 12:36:18
【问题描述】:
我有许多来自 {BatchGetSymbols} 的股票价格系列,我认为是一个 {quantmod} 包装器,并且希望在系列的开始和/或结束时有一段长时间不变的价格时过滤掉.并非所有的代码都有这些不变的部分。在下面的示例中,我想删除开头不变的 10 美元和结尾的 5 美元,只保留最后的 10 美元、前 5 美元以及两者之间的不同价格。
无法提前知道不变零件的价格,并且会因情况而异。系列中的第一个日期将具有第一个不变价格的价格,最后一个日期将具有第二个不变价格。我有将近 500 万行想要一个 data.table 解决方案。
``` r
# Data
library(data.table)
data <-
data.table::data.table(
ticker = "stockA",
date = seq.Date(
from = as.Date("2017-6-30"),
to = as.Date("2017-7-19"),
by = 1
),
price = c(rep(10, 5), rnorm(10, 8, 1), rep(5, 5))
)
# Plot showing unchanging portion at start and end
plot(data$price)
```
DESIRED RESULT:
``` r
new_data <-
rbind(
data[!price %in% c(10, 5)],
data.table(
ticker = "stockA",
date = c(as.Date("2017-06-30"), as.Date("2017-08-29")),
price = c(10, 5)
))[order(date)]
new_data
#> ticker date price
#> 1: stockA 2017-06-30 10.000000
#> 2: stockA 2017-07-05 6.890370
#> 3: stockA 2017-07-06 8.137852
#> 4: stockA 2017-07-07 7.759324
#> 5: stockA 2017-07-08 8.861941
#> 6: stockA 2017-07-09 8.250837
#> 7: stockA 2017-07-10 8.570328
#> 8: stockA 2017-07-11 8.826646
#> 9: stockA 2017-07-12 7.872192
#> 10: stockA 2017-07-13 7.755318
#> 11: stockA 2017-07-14 9.731524
#> 12: stockA 2017-08-29 5.000000
```
由reprex package (v2.0.0) 于 2021 年 7 月 22 日创建
【问题讨论】:
-
对于您的实际情况,您可能在一段时间内没有相同的值。在这种情况下,您如何定义“不变”? 10.00 和 9.99 是否会被视为不变?
-
可能存在机器精度问题,但您可以从 DT[rleid(Price)==1L] 开始
-
不,不变的数字正好是 10.00。 {BatchGetSymbols} 使用第一个可变值作为虚拟变量来填充所有缺失的价格。我这样设置可能是个错误。
标签: r data.table quantmod