Синтаксис дополнительных параметров
Допустим, у меня есть фрейм данных со столбцами данных, и я хочу вычислить одностороннюю скользящую среднюю для каждого столбца. Почему это работает
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)
Это не будет работать (и не будет хорошей идеей) по нескольким причинам (может быть, и больше):
FUN
является формальным аргументом для обоихapply
а такжеrollapply
,...
передаются в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)