Возвращайте значение индекса или количество с помощью функции Rollapply

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

# Sample Data
dates <- c("2014-01-01","2014-01-02","2014-01-03","2014-01-04","2014-01-05",
       "2014-01-06","2014-01-07","2014-01-08","2014-01-09","2014-01-10")
data <- c(20,12,31,26,22,22,31,10,22,23)
xts.object <- as.xts(data,as.Date(dates))

# Apply 4-Day Min
rollMin <- rollapply(xts.object,4,min)
xts.object2 <- cbind(xts.object,rollMin)

# Desired Output
desiredOutput <- c(NA,NA,NA,3,4,1,2,1,2,3)
xts.object3 <- cbind(xts.object2,desiredOutput)
colnames(xts.object3) <- c("data","rollMin","desiredOutput")

введите здесь описание изображения

Первые 3 наблюдения желаемого вывода являются NA, потому что размер окна, выбранный для функции rollapply, установлен на 4. В 4-м наблюдении минимальное значение было 12, и это было верно в течение 3 дней, поэтому желаемый вывод отображает 3 на 2014-01- 04.

Спасибо еще раз!


person geoQuant    schedule 31.03.2014    source источник
comment
Почему значения 6-го и 7-го должны быть 1 и 2, а не 2 и 3?   -  person Joshua Ulrich    schedule 01.04.2014


Ответы (1)


Вы также можете использовать rollapply здесь. which.min вернет индекс минимального значения. Чтобы получить диапазон дней, вы должны уменьшить размер окна (+ один, потому что в R индексы начинаются с 1) на индекс.

rollapply(xts.object,4,function(x)NROW(x)-which.min(x)+1)
#           [,1]
#2014-01-01   NA
#2014-01-02   NA
#2014-01-03   NA
#2014-01-04    3
#2014-01-05    4
#2014-01-06    2
#2014-01-07    3
#2014-01-08    1
#2014-01-09    2
#2014-01-10    3
person sgibb    schedule 31.03.2014
comment
@JoshuaUlrich: Вы правы. Я не заметил неожиданного (по крайней мере для меня) поведения 6-го и 7-го значения (см. ваш комментарий к вопросу). Я подожду ответа ОП и в конечном итоге отредактирую/удалю свой ответ. - person sgibb; 01.04.2014
comment
Очень круто! Спасибо, я не знал о функции which.min. Я думаю, что неправильно изложил свою проблему, но работа с вашим решением помогла мне разобраться в моей проблеме. - person geoQuant; 01.04.2014
comment
Я собирался ответить примерно тем же, но без хардкодинга 4: function(x) NROW(x)-which.min(x)+1. - person Joshua Ulrich; 01.04.2014
comment
@JoshuaUlrich: Спасибо, так даже лучше. Я изменил свой ответ. - person sgibb; 01.04.2014