【问题标题】:extracting time series data where measurements are lowest提取测量值最低的时间序列数据
【发布时间】:2016-02-15 04:22:07
【问题描述】:

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

您首先注意到的是测量值在短时间内触底的短段。这种情况发生的时间长短不一。我试图找出一种方法来自动提取该区域的开始和结束时间,以获取 1000 个此类数据帧。

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

【问题讨论】:

  • 您可以使用rle(mtcars$mpg < 20) 之类的内容,但您需要使用足够数量的数据进行编辑才能重现它以获得具体答案。
  • 谢谢,rle 命令可能非常有用。但是,我不确定如何使用它来返回相关的时间数据。
  • 找到diff 的“运行”小于阈值而不是阈值系列本身可能更可靠。

标签: r time-series


【解决方案1】:

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 &lt; 20 所在的行:

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

现在找到r2lengths 最大的index,即最长运行的索引。使用该值将 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 可以使这里的语法更直接一点,但步骤几乎相同。

【讨论】:

  • 这很棒。谢谢。
  • 很高兴它很有用!如果它回答了您的问题,请考虑接受或投票。
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 2023-03-10
  • 2021-01-07
  • 2019-12-31
  • 1970-01-01
  • 2015-07-01
  • 2023-02-25
  • 2023-01-27
相关资源
最近更新 更多