2016-05-11 4 views
-1

Я хочу разбить временные ряды (данные о ценах) на основе того, показывает ли следующая точка данных увеличение, уменьшение или отсутствие изменений.R: данные временных рядов на основе условий

Пример:

В наборе as.ts(c(1,2,3,4,5,5,4,3,2,1)) эти точки данных следуют вверх будет 1, 2, 3, 4.

Я подозреваю, что это можно решить аккуратно с помощью функции if, но я не уверен, как указать следующую строку, и я не уверен, как будет выглядеть синтаксис.

Любая помощь была бы принята с благодарностью!

+0

Каков ваш ожидаемый выход? два временных ряда? что вы пробовали до сих пор? –

+0

@ColonelBeauvel ожидаемым выходом будет 3 кадра данных, по одному для каждого результата (затем вверх, затем вниз и без изменений). Я попытался использовать функцию 'if' и функцию' split', но не смог указать следующую строку как условие – youjustreadthis

ответ

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 

Вы можете заменить первый NA, используя по умолчанию в lag или отдельно.

EDIT: на основе дополнительного выхода желаемого за комментарии ниже, я редактирую ответ:

Вы можете сохранить результат выше через тритон - например, и извлечь исходные значения, которые принадлежат каждому из что 'движется' следующим образом:

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, поскольку первый элемент является сиротой без перемещения. В зависимости от того, как вы хотите выводить данные, вы можете настроить это значение на свой вкус.

+0

Большое спасибо за это, он отлично работает. Я понимаю, что я не указал, что в вопросе, поэтому почему я принял ваш ответ, но как я могу записать значения, за которыми следует изменение в отдельных тайм-серверах? – youjustreadthis

+1

Если вы сохранили этот выше результат, скажем - 'newts'. Вы можете получить все после первого изменения в 'down', используя что-то вроде этого:' newts [which.max (newts == 'down'): length (тритоны)] ' – Gopala

+0

Снова спасибо, мой вопрос был больше нацелен на то, как получить значение, соответствующее« вниз »для каждого появления в таймсерах. Извинения за неясность. – youjustreadthis

Смежные вопросы