当列标题是日期时,将两个时间序列组合为不同的范围

时间:2017-03-24 22:48:04

标签: r merge

我很难尝试组合两个具有不同范围的时间序列数据集,并且两者都存储在第1列中的项目#和列为标题的日期中。例如:

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提取数据吗?或者使用这种格式还有一种简单的方法吗?

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

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

示例:

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 )

答案 1 :(得分:0)

通常在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)base 或者,没有动物园使用上面的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]