Я хочу взять процентную разницу в списке временных рядов, но сталкиваюсь с ошибкой, когда список содержит пустой элемент list().
Например, дан список myList
, который выглядит так:
set.seed(230)
zoo.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1
myList <- list(zoo(c(NA,rnorm(4)), zoo.Date),
zoo(c(rnorm(4), NA), zoo.Date),
list(),
zoo(c(rnorm(2), NA, rnorm(2)), zoo.Date))
Я могу взять разницу каждого элемента с помощью myList %>% lapply(function(x) diff(x))
Но как только я пытаюсь разделить на предыдущий элемент myList %>% lapply(function(x) diff(x) / lag(x, -1))
, я получаю ошибку Error in attr(x, "tsp") <- c(1, NROW(x), 1) : cannot assign 'tsp' to zero-length vector
.
Проблема заключается в элементе list(). Я мог бы избавиться от этого, но я хочу убедиться, что четвертый объект в myList соответствует четвертому объекту результирующего (отложенного) списка. Другими словами, я хочу, чтобы вывод выглядел так:
[[1]]
2003-02-03 2003-02-07 2003-02-09 2003-02-14
NA -1.431227 2.245691 0.100597
[[2]]
2003-02-03 2003-02-07 2003-02-09 2003-02-14
-0.9078077 12.8523189 -1.2523403 NA
[[3]]
NA
[[4]]
2003-02-03 2003-02-07 2003-02-09 2003-02-14
-1.177138 NA NA -2.203719
Или с [[3]]
как list()
или NULL
или что-то еще пустое.
Я пытался использовать такие вещи, как myList %>% unlist(recursive=F) ...
и myList %>% lapply(function(x) ifelse(length(x) == 0, NA, x)) %>% lapply(function(x) diff(x) / lag(x, -1))
, но они не работают.