Возвращаемое значение вчерашнего дня в объекте xts в R

Это хвост объекта xts:

           SPY.Close    mavg     dn.1     up.1
2011-02-16    133.85 132.446 128.8502 130.9545
2011-02-17    134.25 132.793 129.0212 131.2241
2011-02-18    134.53 133.131 129.2198 131.5016
2011-02-22    131.83 133.117 129.4104 131.6236
2011-02-23    131.02 132.962 129.5961 131.7072
2011-02-24    130.93 132.828 129.7575 131.7792

Учитывая простую вложенную функцию ifelse(), передаваемую каждый день:

signal <- ifelse(t$mavg > t$up.1, 1, ifelse(t$mavg < t$dn.1, -1, 99))

Значение из этого правила можно добавить к объекту:

t$signal = signal

Получение нового объекта (я взял раздел для иллюстрации):

           SPY.Close    mavg      dn.1      up.1 signal
2010-11-18    119.96 120.713 118.17955 119.99845      1
2010-11-19    120.29 120.470 118.33112 120.09688      1
2010-11-22    120.19 120.240 118.47911 120.18489      1
2010-11-23    118.45 119.924 118.55112 120.20888     99
2010-11-24    120.20 119.734 118.63565 120.27635     99

Как я могу переписать вложенный оператор ifelse() так, чтобы каждый раз, когда он оценивается как 99, вместо него возвращалось значение предыдущего дня?

ПРИМЕЧАНИЕ: если вложенный оператор ifelse() не может быть записан как указано из-за парадокса курица/яйцо, тогда будет достаточно отдельного оператора для преобразования 99 в 1.


r xts
person Milktrader    schedule 25.02.2011    source источник


Ответы (2)


Вы отказываетесь от условности 99 и используете настоящие АН. Тогда вам следует познакомиться с zoo::na.locf, который гласит: "для NA последнее наблюдение переноситься вперед".

M <- read.table(textConnection(" SPY.Close    mavg      dn.1      up.1
2010-11-18    119.96 120.713 118.17955 119.99845   
2010-11-19    120.29 120.470 118.33112 120.09688   
2010-11-22    120.19 120.240 118.47911 120.18489   
2010-11-23    118.45 119.924 118.55112 120.20888   
2010-11-24    120.20 119.734 118.63565 120.27635   
") )
M <- cbind(M, signal = ifelse(M$mavg > M$up.1, 1, ifelse(M$mavg < M$dn.1, -1, NA)) )
M$signal <- na.locf(M$signal)
person IRTFM    schedule 25.02.2011
comment
Святой дым, который работает! Я знал, что na.locf() избавился от NA, но упустил тот момент, что он переносит последнее наблюдение. Приятно избегать другого оператора потока управления, когда он не нужен. - person Milktrader; 25.02.2011

Какое значение предыдущего дня вам нужно? Если вам нужно signal из предыдущего дня, вы не можете получить доступ к вчерашнему значению до того, как ifelse завершит его создание. Попробуйте это вместо этого:

tick$lagsignal <- c(NA, head(tick$signal, -1))
tick$newsignal <- ifelse(tick$signal == 99, tick$lagsignal, tick$signal)
person J. Win.    schedule 25.02.2011
comment
tick$lagsignal ‹- c(NA, head(tick$signal, -1) нужен дополнительный ) в конце. - person Milktrader; 25.02.2011
comment
это кажется чище, чем цикл for, который я взламываю, но если у вас есть два или более последовательных сигнала tick$== 99, это не работает, потому что сигнал tick$lag становится равным 99. - person Milktrader; 25.02.2011