我有一个带时间序列测量的数据帧。一列是时间,另一列是测量。当您绘制时间序列,它看起来像这样:提取测量值最低的时间序列数据
通过眼睛你注意到的第一件事是短节段,其中测量走出低谷的时间很短。这种情况发生的时间不尽相同。我试图找出一种方法来自动抽取该区域的开始和结束时间,以获取这些类型的数据帧中的1000个。
该区域中的值不一定是最小的测量值(所以我不能设置过滤的阈值),但它们是较低值的最长延伸值。
我有一个带时间序列测量的数据帧。一列是时间,另一列是测量。当您绘制时间序列,它看起来像这样:提取测量值最低的时间序列数据
通过眼睛你注意到的第一件事是短节段,其中测量走出低谷的时间很短。这种情况发生的时间不尽相同。我试图找出一种方法来自动抽取该区域的开始和结束时间,以获取这些类型的数据帧中的1000个。
该区域中的值不一定是最小的测量值(所以我不能设置过滤的阈值),但它们是较低值的最长延伸值。
使用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
可以使语法这里一点更直接,但步骤是非常一样。
这太好了。谢谢。 –
很好用!如果它回答你的问题,请考虑接受或upvoting。 – alistaire
你可以使用类似'rle(mtcars $ mpg <20)'的东西,但是你需要编辑一个足够数量的数据来重现它以得到一个具体的答案。 – alistaire
谢谢,rle命令可能非常有用。不过,我不确定如何使用它来回到相关的时间数据。 –
也许更有效的方法是找到“diff”小于阈值的“运行”,而不是对系列本身进行阈值处理。 – fishtank