Хотя ответ @ G.Grothendieck лучше во многих отношениях, вот некоторый контекст для того, что может пойти не так в вашем случае:
testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], rollapply, FUN = mean, width = 31)
# Error in mean.default(X[[i]], ...) : 'trim' must be numeric of length one
Это отчасти потому, что вы передаете FUN=
, но это также имя аргумента для lapply
, поэтому вместо него он используется эффективно:
testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) mean(a, trim=rollapply, width = 31))
Второй аргумент mean
- это trim=
, которому в данном случае передается функция rollapply
, явно не правильная.
Следующим шагом будет
testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) rollapply(a, FUN = mean, width = 31))
# Error in `[<-.data.frame`(`*tmp*`, paste0("new_col", 1:4), value = list( :
# replacement element 1 has 3870 rows, need 3900
, потому что один rollapply
не возвращает первые / последние 15 значений (в результате на 30 наблюдений меньше). Вы можете исправить это с помощью fill=NA
:
testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) rollapply(a, FUN = mean, width = 31, fill = NA))
# (no warnings/errors)