R - 将数据帧中的数据从一个时间尺度转换为另一个时间尺度

时间:2014-06-24 20:18:50

标签: r dataframe time-series

我目前有两个数据框,每个数据框都有一个日期列,然后有几列数字数据。第一个数据帧“每日”具有大约但不是每天周期性的数据,而第二个数据帧“每周”具有大约但不完全是周期性的数据。我想要完成的是将“每周”数据框替换为与“每日”具有相同日期的数据框,并使用先前值替换任何缺失值的数据。我知道我可以使用zoo包中的na.locf来回填数据,但我不确定如何有效地从“每日”数据帧中引入日期。也许是合并或加入的一些变体?

示例数据:

daily<-data.frame(
    date1=rep(seq(as.Date("2000-01-01"), as.Date("2000-09-10"), by="1 day"), each=1),
    value1=runif(254),
    value2=rnorm(254), 
    value3=rpois(254,10)
)

weekly<-data.frame(
    date2=rep(seq(as.Date("2000-01-01"), as.Date("2000-09-10"), by="1 week"), each=1),
    value4=runif(37),
    value5=rnorm(37), 
    value6=rpois(37,10)
)

"result" should have date1 and then value4, value5, and value6 as columns and then na.locf can be used to backfill any missing data.

2 个答案:

答案 0 :(得分:3)

使用zoodplyr

library(dplyr)
library(zoo)

daily %>%
   left_join(weekly %>% 
               select(date1 = date2,value4:value6)) %>%
   mutate_each(funs(na.locf),value4:value6) %>%
   head  # obviously don't keep this last function! ;)
Joining by: "date1"
       date1     value1     value2 value3    value4   value5 value6
1 2000-01-01 0.01670715 -0.6526126      9 0.3648553 0.775517      8
2 2000-01-02 0.21580455 -0.7702071      9 0.3648553 0.775517      8
3 2000-01-03 0.16307286  1.1770171      9 0.3648553 0.775517      8
4 2000-01-04 0.91464458  1.5960920      9 0.3648553 0.775517      8
5 2000-01-05 0.13975950  1.4407381     13 0.3648553 0.775517      8
6 2000-01-06 0.75104455 -0.5890481     11 0.3648553 0.775517      8

请注意使用select重命名日期列,使其在两个数据集中都相同。

答案 1 :(得分:3)

IIUC,使用data.table的{​​{1}}功能:

roll
  

require(data.table) ## >= 1.9.2 setkey(setDT(daily), date1) setkey(setDT(weekly), date2) ans <- weekly[daily, roll=TRUE] - 通过引用将data.frame转换为data.table(无副本)
  setDT - 按该列对data.table进行排序(连接所需)
  setkey - 执行滚动连接