2014-09-11 9 views
1

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

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 

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

ответ

0

Объяснение:

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) 
+0

Ok спасибо! На данный момент я определяю функцию заранее, но я просто хотел бы лучше понять структуру приложения ... Спасибо, что расчистили его! – jtanman

Смежные вопросы