2016-02-15 46 views
0

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

enter image description here

通过眼睛你注意到的第一件事是短节段,其中测量走出低谷的时间很短。这种情况发生的时间不尽相同。我试图找出一种方法来自动抽取该区域的开始和结束时间,以获取这些类型的数据帧中的1000个。

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

+0

你可以使用类似'rle(mtcars $ mpg <20)'的东西,但是你需要编辑一个足够数量的数据来重现它以得到一个具体的答案。 – alistaire

+0

谢谢,rle命令可能非常有用。不过,我不确定如何使用它来回到相关的时间数据。 –

+0

也许更有效的方法是找到“diff”小于阈值的“运行”,而不是对系列本身进行阈值处理。 – fishtank

回答

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指数和valuedf,使用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其中r2lengths是最大的,即最长运行的指数。使用该值将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可以使语法这里一点更直接,但步骤是非常一样。

+0

这太好了。谢谢。 –

+0

很好用!如果它回答你的问题,请考虑接受或upvoting。 – alistaire

相关问题