具有空元素的时间序列列表的百分比差异
Percent difference of time series list with empty element
我想获取时间序列列表的百分比差异,但是当列表包含一个空的 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))
之类的东西,但都不起作用。
解决此问题的一种方法是使用 tryCatch
捕获由空列表元素和 return 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
我想获取时间序列列表的百分比差异,但是当列表包含一个空的 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))
之类的东西,但都不起作用。
解决此问题的一种方法是使用 tryCatch
捕获由空列表元素和 return 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