【问题标题】:Combining two time series with different ranges, when column headings are the dates当列标题是日期时,结合具有不同范围的两个时间序列
【发布时间】:2017-08-18 00:47:54
【问题描述】:

我被困在尝试组合两个具有不同范围的时间序列数据集,并且两者都存储在 column1 中的 item# 和作为列标题的日期。例如:

df1

#ITEM   1/1/16  1/2/16  1/3/16 ... 3/24/17    
#1      350     365     370    ... 400     
#2      100     95      101    ... 95   
#3      5       8       9      ... 15 

另一个数据集范围更小,格式相同,都是日频。

如何将df2 的行追加到df1,尽管范围不同,但要确保合并时日期对齐?对新数据框中的 NA 感到满意,其中 df#2 在 df1 中没有日期值

我是否应该在 xts 对象上创建这些对象,以便在它们合并后我可以轻松地在 X 日期为 item1 提取数据?还是有一种简单的方法可以使用这种格式来做到这一点?

提前感谢您的帮助。

【问题讨论】:

  • 请以可用的形式提供样本数据。将dput(df1[1:3, 1:5])dput(df2[1:3, 1:5]) 的输出粘贴到您的问题中。

标签: r merge


【解决方案1】:

一种选择是使用data.table::rbindlist(df1, df2)fill = TRUE 用 NA 填充缺失的列。

例子:

library(data.table)
dt1 <- data.table(item=c(1,2,3),"d1/1/16" = c(350,100,5) ,"d1/2/16" = c(360,120,7))
dt2 <- data.table(item=c(3,4,5),"d1/2/16" = c(50,50,2) ,"d1/3/16" = c(460,150,9))
l = list(dt1,dt2)
data.table::rbindlist(l, use.names= TRUE, fill=TRUE, idcol=TRUE )

【讨论】:

    【解决方案2】:

    通常在 R 时间序列中以列而不是行表示。假设我们在最后的注释中重复显示了 DF1DF2,这里有一些替代方案

    1) 动物园我们可以通过转置来创建动物园系列。然后合并它们:

    library(zoo)
    
    fmt <- "%m/%d/%y"
    z1 <- setNames(zoo(t(DF1[-1]), as.Date(names(DF1[-1]), fmt)), DF1[[1]])
    z2 <- setNames(zoo(t(DF2[-1]), as.Date(names(DF2[-1]), ftm)), DF2[[1]])
    
    z <- merge(z1, z2)
    

    最好将其保留为动物园系列z,但如果您想转换为数据框,请使用:fortity.zoo(z)

    2) 基础 或者,在没有动物园的情况下使用上面的fmt

    d1 <- data.frame(as.Date(names(DF1[-1]), fmt), t(DF1[-1]))
    names(d1) <- c("Index", DF1[[1]])
    
    d2 <- data.frame(as.Date(names(DF2[-1]), fmt), t(DF2[-1]))
    names(d2) <- c("Index", DF2[[1]])
    
    merge(d1, d2, by = "Index", all = TRUE)
    

    注意:假设可重现形式的输入为:

    Lines <- "ITEM   1/1/16  1/2/16  1/3/16  3/24/17    
    1      350     365     370     400     
    2      100     95      101     95   
    3      5       8       9      15"
    
    DF <- read.table(text = Lines, header = TRUE, check.names = FALSE)
    DF1 <- DF[1:2, 1:3]
    DF2 <- DF[3, -3]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 2018-02-23
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      相关资源
      最近更新 更多