我有一個帶時間序列測量的數據幀。一列是時間,另一列是測量。當您繪製時間序列,它看起來像這樣:提取測量值最低的時間序列數據
通過眼睛你注意到的第一件事是短節段,其中測量走出低谷的時間很短。這種情況發生的時間不盡相同。我試圖找出一種方法來自動抽取該區域的開始和結束時間,以獲取這些類型的數據幀中的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