簡體   English   中英

R:根據條件拆分時間序列數據

[英]R: Splitting time-series data based on conditions

我希望根據以下數據點是否顯示增加、減少或沒有變化來拆分時間序列(價格數據)。

例子:

在集合as.ts(c(1,2,3,4,5,5,4,3,2,1)) ,數據點后跟 up 將是1, 2, 3, 4

我懷疑這可以用if函數巧妙地解決,但我不確定如何指定下一行,也不確定語法的外觀。

任何幫助將不勝感激!

您可以使用以下兩種方法之一:

1) 使用diff如下:

ifelse(diff(ts) > 0, 'up', ifelse(diff(ts) < 0, 'down', 'none'))

輸出是:

Time Series:
Start = 2 
End = 10 
Frequency = 1 
[1]   up   up   up   up none down down down down

2) 使用dplyr包中的lag函數:

ifelse(ts > lag(ts), 'up', ifelse(ts < lag(ts), 'down', 'none'))

輸出如下:

Time Series:
Start = 1 
End = 10 
Frequency = 1 
 [1] <NA>   up   up   up   up none down down down down

您可以使用lag的默認值或單獨替換第一個 NA。

編輯:根據下面每個評論所需的額外輸出,我正在編輯答案:

您可以將上述結果保存在 newts 中 - 例如,並提取屬於每個“移動”的原始值,如下所示:

newts <- c('up', ifelse(diff(ts) > 0, 'up', ifelse(diff(ts) < 0, 'down', 'none')))
sapply(unique(newts), function(x) ts[newts == x])

輸出如下:

$up
[1] 1 2 3 4 5

$none
[1] 5

$down
[1] 4 3 2 1

這是三個清單。 你可以用它們做任何你想做的事情,或者根據需要將它們組合成其他數據結構。

注意:我將newts預先掛起,因為第一個元素是一個沒有移動的孤兒。 根據您希望事物輸出的方式,您可能需要根據自己的喜好調整此值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM