我很难尝试组合两个具有不同范围的时间序列数据集,并且两者都存储在第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提取数据吗?或者使用这种格式还有一种简单的方法吗?
先谢谢你的帮助。
答案 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时间序列中以列而不是行表示。假设我们在注释中可重复显示DF1
和DF2
,这里有一些替代方案
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]