我目前有两个数据框,每个数据框都有一个日期列,然后有几列数字数据。第一个数据帧“每日”具有大约但不是每天周期性的数据,而第二个数据帧“每周”具有大约但不完全是周期性的数据。我想要完成的是将“每周”数据框替换为与“每日”具有相同日期的数据框,并使用先前值替换任何缺失值的数据。我知道我可以使用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.
答案 0 :(得分:3)
使用zoo
和dplyr
:
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
- 执行滚动连接