Синтаксис дополнительных параметров

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

my.rollapply <- function(x){

    return(rollapply(x,moving.avg,FUN= mean, fill = NA,align = 'right', na.rm = TRUE))

}

averageData <- apply(averageData, 2, my.rollapply)

но

averageData <- apply(averageData, 2, rollapply, width = moving.avg, FUN = mean, fill = NA, align = 'right', na.rm = TRUE)

дает мне ошибку

Error in mean.default(newX[, i], ...) : 
  'trim' must be numeric of length one

Это потому, что само средство требует дополнительных параметров? Как я смогу передать все параметры, чтобы развернуть их внутри приложения?

1 ответ

Решение

Объяснение:

averageData <- apply(averageData, 2, rollapply, width = moving.avg,
                     FUN = mean, fill = NA, align = 'right', na.rm = TRUE)

Это не будет работать (и не будет хорошей идеей) по нескольким причинам (может быть, и больше):

  1. FUN является формальным аргументом для обоих apply а также rollapply,
  2. ... передаются в rollapply и перешел к mean,

поскольку FUN это формальный аргумент applyэто соответствует apply звонок и не прошел через ... к rollapply вызов. Так что ваши apply вызов интерпретируется как:

apply(X=averageData, MARGIN=2, FUN=mean, rollapply, width=moving.avg,
      fill=NA, align='right', na.rm=TRUE)

Что означает mean позвоните внутрь apply цикл это:

mean(tmp[,i], ...)
# which is equivalent to
mean(tmp[,i], rollapply, width=moving.avg, fill=NA, align='right', na.rm=TRUE)

Который терпит неудачу, потому что trim аргумент rollapply, которая является функцией, а не числовым вектором длины 1.

Решение:

В любом случае, простой способ решить эту проблему - использовать by.column аргумент rollapply:

library(xts)
data(sample_matrix)
x <- as.zoo(sample_matrix)
y <- rollmeanr(x, k=moving.avg, fill=NA, na.rm=TRUE, by.column=TRUE)
Другие вопросы по тегам