在R中合并两个不同的数据帧

时间:2010-11-19 16:27:30

标签: 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       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值。

非常感谢您的支持 达尼

2 个答案:

答案 0 :(得分:4)

首先,使用时间序列类(例如zooxts)。

您的第二个插值时间序列应该仍然有一个时间戳,即使它是每小时或每分钟等。使用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))

答案 1 :(得分:2)

我完全错过了第一篇文章。这个是日期。但我同意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