rollapply с функцией, которая возвращает более одного значения

Скажем, я хочу использовать rollapply с функцией, которая возвращает больше, чем значение. Как это:

library(quantmod)
getSymbols("YHOO")

openYHOO <- YHOO[1:10,1]

rollapply(openYHOO, width = 2, range)

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

rollapply(openYHOO, width = 2, function(x) {
  cbind(range(x))
})

rollapply(openYHOO, width = 2, function(x) {
  merge(range(x))
})

Еще ошибки.
Я могу сделать так:

cbind(
  rollapply(openYHOO, width = 2, function(x) {
    range(x)[1]
  }),
  rollapply(openYHOO, width = 2, function(x) {
    range(x)[2]
  })
)

... и это работает.

Однако что, если я хочу вызвать fivenum или использовать что-то гораздо более сложное и требующее больших вычислительных ресурсов в забавном аргументе? Должен ли я вызывать rollapply для каждого значения, которое я хочу вернуть, создавая один и тот же объект снова и снова?

Я что-то упустил или мне следует отказаться от rollapply и свернуть свою собственную функцию скользящего окна?

Можете объяснить, почему этот rollapply(openYHOO, width = 2, range) не работает?


person brandco    schedule 21.08.2015    source источник


Ответы (1)


Используйте аргумент by.column

rollapply(openYHOO, width=2, range, by.column=FALSE)
#            [,1]  [,2]
#2007-01-03    NA    NA
#2007-01-04 25.64 25.85
#2007-01-05 25.64 26.70
#2007-01-08 26.70 27.70
#2007-01-09 27.70 28.00
#2007-01-10 27.48 28.00
#2007-01-11 27.48 28.76
#2007-01-12 28.76 28.98
#2007-01-16 28.98 29.88
#2007-01-17 29.40 29.88

> rollapply(openYHOO, width=2, 
            function(x) fivenum(as.numeric(x)), 
            by.column=FALSE)
#            [,1]  [,2]   [,3]  [,4]  [,5]
#2007-01-03    NA    NA     NA    NA    NA
#2007-01-04 25.64 25.64 25.745 25.85 25.85
#2007-01-05 25.64 25.64 26.170 26.70 26.70
#2007-01-08 26.70 26.70 27.200 27.70 27.70
#2007-01-09 27.70 27.70 27.850 28.00 28.00
#2007-01-10 27.48 27.48 27.740 28.00 28.00
#2007-01-11 27.48 27.48 28.120 28.76 28.76
#2007-01-12 28.76 28.76 28.870 28.98 28.98
#2007-01-16 28.98 28.98 29.430 29.88 29.88
#2007-01-17 29.40 29.40 29.640 29.88 29.88
person GSee    schedule 21.08.2015
comment
Это работает. Спасибо. Не то, что я ожидаю от логического описания by.column в справочном документе. Если TRUE, FUN применяется к каждому столбцу отдельно. Но пример в документе показывает поведение, которое я ищу. Адаптировано для моего примера: rollapply(openYHOO, width = 3, FUN = function(x) coef(lm(x ~ seq_along(x))), by.column = FALSE, align = "right") - person brandco; 21.08.2015