【问题标题】:Percent difference of time series list with empty element时间序列列表与空元素的百分比差异
【发布时间】:2018-07-09 14:35:06
【问题描述】:

我想获取时间序列列表的百分比差异,但是当列表包含空的 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 %&gt;% lapply(function(x) diff(x))取每个元素的区别

但是,一旦我尝试除以前一个元素 myList %&gt;% lapply(function(x) diff(x) / lag(x, -1)),就会收到错误 Error in attr(x, "tsp") &lt;- 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 %&gt;% unlist(recursive=F) ...myList %&gt;% lapply(function(x) ifelse(length(x) == 0, NA, x)) %&gt;% lapply(function(x) diff(x) / lag(x, -1)) 之类的东西,但都不起作用。

【问题讨论】:

    标签: r time-series lapply zoo empty-list


    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多