R:基于条件拆分时间序列数据

R:基于条件拆分时间序列数据,r,split,time-series,R,Split,Time Series,我希望根据以下数据点是否显示增加、减少或无变化来拆分时间序列(价格数据) 例如: 在集合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')) Tim

我希望根据以下数据点是否显示增加、减少或无变化来拆分时间序列(价格数据)

例如:

在集合
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 = 1 
End = 10 
Frequency = 1 
 [1] <NA>   up   up   up   up none down down down down
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
2) 使用
dplyr
软件包中的
lag
功能:

ifelse(ts > lag(ts), 'up', ifelse(ts < lag(ts), 'down', 'none'))
结果如下:

ifelse(diff(ts) > 0, 'up', ifelse(diff(ts) < 0, 'down', 'none'))
Time Series:
Start = 1 
End = 10 
Frequency = 1 
 [1] <NA>   up   up   up   up none down down down down
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
以下是三个列表。您可以对它们执行任何其他操作,或者根据需要将它们组合到其他数据结构中


注意:由于第一个元素是没有移动的孤立元素,因此我正在使用up预挂起
newts
。根据您希望输出内容的方式,您可能需要根据自己的喜好调整此值。

您的预期输出是什么?两个时间序列?到目前为止你尝试了什么?@ColonelBeauvel预期的输出将是3个数据帧,每个结果一个(然后是向上,然后是向下,没有变化)。我曾尝试使用
if
函数和
split
函数,但无法将下一行指定为条件。多亏了这一点,它工作得非常好。我意识到我在问题中没有具体说明这一点,因此我接受了你的答案,但我该如何在单独的时间序列中记录更改后的值呢?如果你保存了上述结果,我们可以说-
newts
。在第一次更改为
down
后,您可以使用以下内容获取所有内容:
newts[which.max(newts='down'):length(newts)]
再次感谢,我的问题更主要的是如何在时间序列中的每次事件中获取say
down
对应的值。抱歉不清楚。我用我认为你在问的问题编辑了答案。传奇!非常感谢。