R - Как продолжить итерацию, когда nrow <N - PullRequest
0 голосов
/ 28 июня 2018

Я использую пакет 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 на основе количества строк в фрейм данных.

1 Ответ

0 голосов
/ 29 июня 2018

Попробуйте заменить число на выбор наименьшего из числа или количества строк, например ::100100

mutate(exp.ma = EMA(val2, n = min(c(5,length(val2)))))
...