Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中合并两个不同的数据帧_R_Time Series - Fatal编程技术网

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

在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

我有两个数据帧。 一个由三个变量组成,即“日期”、“罢工”和“产量”,每天观察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值作为日期的结束,这些日期不再按升序排列

非常感谢您的支持

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。至少我是这么认为的。