[英]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.