R:根据条件分割时间序列数据

时间:2016-05-11 14:59:53

标签: r split time-series

我希望根据以下数据点是显示增加,减少还是没有变化来拆分时间序列(价格数据)。

示例:

在集合as.ts(c(1,2,3,4,5,5,4,3,2,1))中,后跟的数据点将为1, 2, 3, 4

我怀疑使用if函数可以很好地解决这个问题,但我不确定如何指定以下行,也不确定语法的外观。

非常感谢任何帮助!

1 个答案:

答案 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。根据您想要输出的内容,您可能希望根据自己的喜好调整此值。