2015-06-09 46 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一样,这个过程花费几分钟完成 –