我有一个带有时间序列测量的数据框。一列是时间,另一列是测量。当您绘制时间序列时,它看起来像这样:
通过眼睛,您首先注意到的是短片段,其中测量在短时间内触底。这种情况发生的时间会有所不同。我试图找出一种方法来自动拉出该区域的1000个这类数据帧的开始和结束时间。
该区域的值不一定是最小测量值(因此我无法设置过滤的阈值),但它们是较长值的最长值。
答案 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
缩小到values
为TRUE
的行,即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
可以使这里的语法更加直接,但步骤几乎相同。