【问题标题】:R - approximate missing month values using zoo packageR - 使用 zoo 包的近似缺失月份值
【发布时间】:2017-10-06 13:59:38
【问题描述】:

考虑代码:

library('zoo')

data <- c(1, 2, 4, 6)
dates <- c("2016-11-01", "2016-12-01", "2017-02-01", "2017-04-01");
z1 <- zoo(data, as.yearmon(dates))
z2 <- na.approx(z1)

变量z2 如下所示:

nov 2016 dec 2016 feb 2017 apr 2017 
       1        2        4        6 

但我需要z2 与此类似:

nov 2016 dec 2016 jan 2017 feb 2017 mar 2017 apr 2017 
       1        2        3        4        5        6

我只需要估算缺少值的月份的值。感谢您的任何提示。

【问题讨论】:

标签: r zoo


【解决方案1】:

在 zoo 1.8 中使用新的 as.zoo 参数 calendar(默认为 TRUE,因此我们不必指定它),我们可以将输入转换为 "ts",然后再转换回 "zoo"之后再次申请na.approx

na.approx(as.zoo(as.ts(z2)))
## Nov 2016 Dec 2016 Jan 2017 Feb 2017 Mar 2017 Apr 2017 
##        1        2        3        4        5        6 

对于之前版本的 zoo,我们可以做同样的事情,但需要手动将索引转换回 "yearmon"

na.approx(aggregate(as.zoo(as.ts(z2)), as.yearmon, c))

ma​​grittr

将 zoo 与 magrittr 一起使用,可以分别表示为以下管道:

library(magrittr)

z2 %>% as.ts %>% as.zoo %>% na.approx

z2 %>% as.ts %>% as.zoo %>% aggregate(as.yearmon, c) %>% na.approx

【讨论】:

    【解决方案2】:

    仅使用 na.approx 和基础 R 的一种方式:

    #add your data and dates together
    df <- data.frame(data, dates = as.Date(dates))
    #create all dates using seq
    new_dates <- data.frame(dates = seq(as.Date(dates[1]), as.Date(dates[4]), by = 'month'))
    #merge the two and then na.approx
    new_df <- merge(new_dates, df, by = 'dates', all.x = TRUE)
    na.approx(new_df$data)
    

    输出:

    [1] 1 2 3 4 5 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2020-02-08
      • 2016-09-03
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多