2016-02-15 45 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

相關問題