提取测量最低的时间序列数据

时间:2016-02-15 04:22:08

标签: r time-series

我有一个带有时间序列测量的数据框。一列是时间,另一列是测量。当您绘制时间序列时,它看起来像这样:

enter image description here

通过眼睛,您首先注意到的是短片段,其中测量在短时间内触底。这种情况发生的时间会有所不同。我试图找出一种方法来自动拉出该区域的1000个这类数据帧的开始和结束时间。

该区域的值不一定是最小测量值(因此我无法设置过滤的阈值),但它们是较长值的最长值。

1 个答案:

答案 0 :(得分:0)

使用mtcars作为示例(不理想,因为它不是时间序列,但假设它是,并且它按时间排序;也是如此):

df <- mtcars                    # get sample data
r <- rle(mtcars$mpg < 20)       # save run-length encoding

所以r看起来像

> r
Run Length Encoding
  lengths: int [1:9] 4 3 2 8 4 4 3 3 1
  values : logi [1:9] FALSE TRUE FALSE TRUE FALSE TRUE ...

现在将其重新排列为data.frame,为行号添加index列:

r <- with(r, data.frame(lengths, values, index = seq_along(r$lengths)))

所以

> head(r)
  lengths values index
1       4  FALSE     1
2       3   TRUE     2
3       2  FALSE     3
4       8   TRUE     4
5       4  FALSE     5
6       4   TRUE     6

run索引和value添加到df,使用rep重复每次正确的次数:

df$run <- rep(1:nrow(r), times = r$lengths)
df$values <- rep(r$values, times = r$lengths)

r缩小到valuesTRUE的行,即mpg < 20

r2 <- r[r$values == TRUE,]

现在找到index r2 lengths最大的df,即最长跑的索引。使用该值将df2 <- df[df$run == r2[r2$lengths == max(r2$lengths),'index'],] 向下切割为仅那些行,即运行的行。

> rbind(df2[1,], df2[nrow(df2),])
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb run values
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4   4   TRUE
Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4   4   TRUE

如果您只想要这些行的第一行和最后一行,

dplyr

注意: git remote add contribution /url/contributing/repo git fetch contribution git merge contribution/abranch 可以使这里的语法更加直接,但步骤几乎相同。