2015-06-09 69 views
1

我有這樣一個數據幀:表本周至今

> df 

    week month year x 
1 1-7 sep 2013 566 
2 8-14 sep 2013 65 
3 15-21 sep 2013 144 
4 22-28 sep 2013 455 
5 29-30 sep 2013 1212 

而且需要將其轉換爲:

> df_out 
     date  x 
1 01/09/2013 80.86 
2 02/09/2013 80.86 
3 03/09/2013 80.86 
4 04/09/2013 80.86 
5 05/09/2013 80.86 
6 06/09/2013 80.86 
7 07/09/2013 80.86 
8 08/09/2013 9.29 
9 09/09/2013 9.29 
10 10/09/2013 9.29 
11 11/09/2013 9.29 
12 12/09/2013 9.29 
13 13/09/2013 9.29 
14 14/09/2013 9.29 

說明:2013年9月的1-7周有566臺X。我想要構建一個時間序列,爲每週的每一天(從2013-09-01到2013-09-07)提供單位,等於566/7。

注意可能是一排(如我的df第5行),我們只有2天。因此,2013-09-29的值x將是1212/2 = 606

我試圖在Excel中執行此操作,構建每行df的開始日期和結束日期。這是由「 - 」分裂周列和構建日期列。我可以在R中完成,但然後我卡住了。

數據:

df <- structure(list(week = c("1-7", "8-14", "15-21", "22-28", "29-30" 
), month = c("sep", "sep", "sep", "sep", "sep"), year = c(2013L, 
2013L, 2013L, 2013L, 2013L), x = c(566L, 65L, 144L, 455L, 1212L 
)), .Names = c("week", "month", "year", "x"), class = "data.frame", row.names = c(NA, 
-5L)) 
+0

是你的日期是否正確?它們不應該相差7天而不是1天嗎?例如,不是01/09/2013 80.86 02/09/2013 80.86但是01/09/2013 80.86 ** 08 **/09/2013 80.86等... – user1945827

+0

否,可以。請參閱@ Robert的答案 –

+0

順便說一句,我也製作了一個Excel解決方案。我會找到一個時間在這裏發佈它 –

回答

2

試試這個:

dfl=split(df,1:nrow(df)) 
do.call(rbind,lapply(dfl,function(wd){ 
    d=as.numeric(unlist(strsplit(wd$week, "-", fixed = TRUE))) 
    days=d[1]:d[2] 
    date=as.Date(paste(wd$year,wd$month,days,sep="/"),"%Y/%b/%d") 
    x=round(rep(wd$x/length(days),length(days)),2) 
    data.frame(date,x) 
})) 
  date  x 
1.1 2013-09-01 80.86 
1.2 2013-09-02 80.86 
1.3 2013-09-03 80.86 
1.4 2013-09-04 80.86 
1.5 2013-09-05 80.86 
1.6 2013-09-06 80.86 
1.7 2013-09-07 80.86 
2.1 2013-09-08 9.29 
2.2 2013-09-09 9.29 
2.3 2013-09-10 9.29 
2.4 2013-09-11 9.29 
2.5 2013-09-12 9.29 
2.6 2013-09-13 9.29 
2.7 2013-09-14 9.29 
3.1 2013-09-15 20.57 
3.2 2013-09-16 20.57 
3.3 2013-09-17 20.57 
3.4 2013-09-18 20.57 
3.5 2013-09-19 20.57 
3.6 2013-09-20 20.57 
3.7 2013-09-21 20.57 
4.1 2013-09-22 65.00 
4.2 2013-09-23 65.00 
4.3 2013-09-24 65.00 
4.4 2013-09-25 65.00 
4.5 2013-09-26 65.00 
4.6 2013-09-27 65.00 
4.7 2013-09-28 65.00 
5.1 2013-09-29 606.00 
5.2 2013-09-30 606.00 
+0

你能概括一個以上的列功能?我的意思是,如果我的df有y,z,...像x這樣的列(數字) –

+1

只需要將'xyz = sapply(wd [-c(1:3)],function(xs)round(rep(xs /長度(天),長度(天)),2)); data.frame(date,xyz)' – Robert

+0

完美,適用於我4f +行的'df'。但是當我使用40k +行進行嘗試時,'dfl'(list)變得非常大,就像工作區中的100Mb一樣,這個過程花費幾分鐘完成 –