Процентная разница списка временных рядов с пустым элементом

Я хочу взять процентную разницу в списке временных рядов, но сталкиваюсь с ошибкой, когда список содержит пустой элемент 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)), но они не работают.


person wtrs    schedule 30.01.2018    source источник


Ответы (1)


Один из способов обойти это — использовать tryCatch, чтобы поймать ошибку, вызванную пустым элементом списка, и вернуть NA (или что-то еще):

lapply(myList, function(x) tryCatch(
  { diff(x) / lag(x, -1) }, 
  error=function(e){ NA }
  ))

# [[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]]
# [1] NA
# 
# [[4]]
# 2003-02-03 2003-02-07 2003-02-09 2003-02-14 
#  -1.177138         NA         NA  -2.203719 
person cmaher    schedule 30.01.2018