Я использую пакет TTR для вычисления экспоненциальных скользящих средних для большого списка фреймов данных. Когда я пытаюсь выполнить цикл for ниже, я получаю ошибку оценки, если я установил n> 1.
options(digits = 3)
for(i in seq_along(list)){
list[[i]] <- list[[i]] %>%
mutate(exp.ma = EMA(x, n = 10))
}
Ошибка в mutate_impl (.data, точки):
Ошибка оценки: n = 10 находится вне допустимого диапазона: [1, 7].
При настройке n = 2:
Ошибка в mutate_impl (.data, точки):
Ошибка оценки: n = 2 вне допустимого диапазона: [1, 1].
Интересно, что я могу успешно выполнить код, если я установлю n = nrow(list[[i]])
, однако это лишает меня возможности указать любое другое значение n
- это либо n = 1
, либо n = nrow(list)
.
Это озадачивает меня, потому что у меня нет проблем с запуском цикла for с использованием функции rollmean
, независимо от количества периодов (k). Кроме того, у меня нет проблем с запуском одной и той же функции на одном фрейме данных:
df <- df %>% mutate(exp.ma = EMA(x, n = 10))
Мне кажется, что эта ошибка связана с успешной / неудачной итерацией i
по длине списка. Я уверен, что мой код не самый эффективный способ решения этой проблемы, поэтому любые рекомендации приветствуются.
РЕДАКТИРОВАТЬ: воспроизводимый пример
library(TTR)
library(tidyverse)
library(plyr)
# reproducible example
set.seed(1363)
d1 <- data.frame(val1 = c(rnorm(n=3, mean=15)), val2 = c(rnorm(n=3, mean=15)))
d2 <- data.frame(val1 = c(rnorm(n=35, mean=12)), val2 = c(rnorm(n=35, mean=25)))
my.list <- list(df1 = d1, df2 = d2)
for (i in seq_along(my.list)) {
my.list[[i]] <- my.list[[i]] %>%
mutate(exp.ma = EMA(val2, n = 5))
}
> Error in EMA(val2, n = 5) : n = 5 is outside valid range: [1, 3]
Я понял, в чем причина ошибки. Первый фрейм данных в списке (d1) имеет 3 строки, поэтому при установке n = 5 будет получено n=5 is outside valid range: [1, 3]
Первым ключом должен был быть тот факт, что цикл for работал, когда я установил n=nrow(list[[i]])
Мой вопрос сейчас заключается в том, как мне установить цикл for, чтобы он не останавливался, когда он циклически переходит по фрейму данных с nrows < n
или, что еще лучше, он вычисляет первое доступное значение EMA на основе количества строк в фрейм данных.