2014-06-24 29 views
1

我目前有兩個數據框,每個數據框都有一個日期列和幾列數字數據。第一個數據幀「每日」的數據在週期性上近似但不完全每天,而第二個數據幀「每週」的數據在週期性上近似但不完全每週一次。我想完成的是將「每週」數據框替換爲與「每日」具有相同日期的數據框,並用任何缺失值的先前值填充數據。我知道我可以使用zoo包中的na.locf來回填數據,但我不確定如何有效地從「每日」數據框中引入日期。也許一些合併或加入的變化?R - 將數據幀中的數據從一個時間尺度轉換爲另一個時間尺度

樣本數據:

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

確定,聽起來似乎合理。你能包含一些數據嗎?見'?dput'。一些虛擬數據也可以工作。 – AndrewMacDonald

+0

@AndrewMacDonald增加了虛擬數據。 – user2844947

回答

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 

注意,使其在兩個datsets同樣使用select重命名的日期列。

+0

工作得很好。謝謝。 %>%雖然是%? – user2844947

+0

我需要更改代碼中的結果數據幀中的值4,值5和值6。換句話說,只有每週的數據列。 – user2844947

+0

'%>%'是一個管道操作符,它在'dplyr'中用於將一個函數的輸出移動到另一個函數的輸出中。它最初是在'magrittr'包中。見[這裏](http://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html) – AndrewMacDonald

3

IIUC,使用data.tableroll特徵:

require(data.table) ## >= 1.9.2 
setkey(setDT(daily), date1) 
setkey(setDT(weekly), date2) 
ans <- weekly[daily, roll=TRUE] 

setDT - 通過參考data.frame轉換爲data.table(無複製)
setkey - 按該列排序data.table (需要加入)
x[i, roll=TRUE] - 執行滾動連接

+0

好,簡潔的答案,但我想保留我的數據作爲數據框而不是數據表。 – user2844947

相關問題