在R中合并两个不同的数据帧
我有两个数据帧。 一个由三个变量组成,即“日期”、“罢工”和“产量”,每天观察20次,每月观察100次,每年观察1200次(交易日),如下所示在R中合并两个不同的数据帧,r,time-series,R,Time Series,我有两个数据帧。 一个由三个变量组成,即“日期”、“罢工”和“产量”,每天观察20次,每月观察100次,每年观察1200次(交易日),如下所示 Date Price Vol 2008-09-01 20 0.2 2008-09-01 30 0.5 ... 因此,对于每个月,我对价格和销售量都有一定的值,分别从10到40、0.1到0.7 第二个包含来自第一个的插值。因此,我不再有日期,不管其他变量的步骤有多小: Price
Date Price Vol
2008-09-01 20 0.2
2008-09-01 30 0.5
...
因此,对于每个月,我对价格和销售量都有一定的值,分别从10到40、0.1到0.7
第二个包含来自第一个的插值。因此,我不再有日期,不管其他变量的步骤有多小:
Price Vol
20 0.2
21 0.21
22 0.24
30 0.5
因此,当一帧显示离散时间内的值时,另一帧或多或少具有连续性。现在我的问题是:如何让R将第二个数据帧合并到第一个数据帧中,接管两个离散数据帧之间的连续价格/批量的日期,从而得到如下结果:
Date Price Vol
2008-09-01 20 0.2
2008-09-01 21 0.21
2008-09-01 22 0.24
...
2008-09-01 30 0.5
我就是不知道怎么做。我总是以NA值作为日期的结束,这些日期不再按升序排列
非常感谢您的支持Dani首先,使用时间序列类(例如
zoo
或xts
)
第二个插值时间序列应该仍然有时间戳,即使是每小时或每分钟,等等。使用merge
将它们组合在一起,然后使用na.locf
从低频时间序列向前传递值
下面是一个例子:
ts1 <- zoo(1:5, as.POSIXct(as.Date("2010-10-01") + 1:5))
ts2 <- zoo(1:(5 * 24), as.POSIXct("2010-10-01 00:00:00") + (1:(5 * 24) * 3600))
na.locf(merge(ts1, ts2))
ts1我在第一篇文章中完全没有抓住要点。这一个没有日期。但我同意Shane的观点,除非下游函数需要数据帧,否则时间序列是个好主意
A <- data.frame(date=rep("2001-05-25", 2), price=c(20, 30), vol=c(0.2, 0.5))
B <- data.frame(price=seq(min(A$price), max(A$price), by=1))
C <- merge(A, B, all=TRUE)
index <- which(!is.na(C$vol))
for (i in seq(nrow(A))[-1]) {
C$date[index[i-1]:index[i]] <- rep(A$date[i-1], A$price[i] - A$price[i-1] + 1)
C$vol[index[i-1]:index[i]] <- seq(A$vol[i-1], A$vol[i], length=(A$price[i] - A$price[i-1] + 1))
}
ans <- C[, c(2, 1, 3)]
ans
date price vol
1 2001-05-25 20 0.20
2 2001-05-25 21 0.23
3 2001-05-25 22 0.26
4 2001-05-25 23 0.29
5 2001-05-25 24 0.32
6 2001-05-25 25 0.35
7 2001-05-25 26 0.38
8 2001-05-25 27 0.41
9 2001-05-25 28 0.44
10 2001-05-25 29 0.47
11 2001-05-25 30 0.50
A请添加给出非期望结果的代码,并向我们提供您的数据结构。类的日期是POSIXlt,数据,时间,字符?例如,恐怕这是解决错误问题的正确方法。你甚至不需要时间序列。将日期视为级别必须分布在第二个数据帧上的系数,从第一个数据帧的值开始。我懒得去寻找解决方案,但这里已经解决了。@Joris我可能遗漏了一些东西,但我认为我的例子符合他的要求。是的,时间序列是不必要的,但它很有用。你的出发点不正确。ts1应该看起来像zoo(seq(1,by=24,length.out=5),as.POSIXct(as.Date(“2010-10-01”)+1:5))。然后您应该得到一个数据帧,其中ts1中的日期重复了24次,但值为ts2。至少我是这么认为的。