我希望根据以下数据点是显示增加,减少还是没有变化来拆分时间序列(价格数据)。
示例:
在集合as.ts(c(1,2,3,4,5,5,4,3,2,1))
中,后跟的数据点将为1, 2, 3, 4
。
我怀疑使用if
函数可以很好地解决这个问题,但我不确定如何指定以下行,也不确定语法的外观。
非常感谢任何帮助!
答案 0 :(得分:1)
您可以使用以下两种方法之一:
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)使用lag
包中的dplyr
函数:
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。
编辑:根据下面每条评论所需的额外输出,我正在编辑答案:
您可以将上述结果保存为蝾螈 - 例如,并提取属于每个&#39;移动的原始值。如下:
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
。根据您想要输出的内容,您可能希望根据自己的喜好调整此值。