2015-12-01 82 views
1

我有一個id_client不同日期的表。我需要創建一個表格,每個客戶端的最大日期和最小日期之間的日期都是,全部爲。例如,我的表是:R-ddply:彙總時轉換爲數字的日期

tbl<-data.frame(id_cliente=c(1,1,1,1,2,3,3,3), 
       fecha=c('2013-01-01', '2013-06-01','2013-05-01', '2013-04-01', 
         '2013-01-01', '2013-01-01','2013-05-01','2013-04-01')) 

tbl$fecha<-as.Date(as.character(tbl$fecha)) 

我需要像一個表來結束:

id_cliente fecha 
1 01/01/2013 
1 01/02/2013 
1 01/03/2013 
1 01/04/2013 
1 01/05/2013 
1 01/06/2013 
2 01/01/2013 
3 01/01/2013 
3 01/02/2013 
3 01/03/2013 
3 01/04/2013 
3 01/05/2013 

我以爲我可以ddply(plyr包)使用,所以我創建了一個獲取函數個月的序列:

meses<-function(xMin, xMax){ 
    seq(from=as.Date(xMin, , '%Y-%m-%d'), to=as.Date(xMax, '%Y-%m-%d'), by='month')} 

然後我ddply適用於:

library(plyr) 
vf<-ddply(tbl, .(id_cliente), summarize, maxF=max(fecha), minF=min(fecha), 
       sec=list(meses(xMin=minF, xMax=maxF))) 

但我的表是:存儲在列表

> vf 
    id_cliente  maxF  minF          sec 
1   1 2013-06-01 2013-01-01 15706, 15737, 15765, 15796, 15826, 15857 
2   2 2013-01-01 2013-01-01         15706 
3   3 2013-05-01 2013-01-01  15706, 15737, 15765, 15796, 15826 

日期被轉換爲數字。

我知道我可以將數字轉換爲日期。所以:

convFecha<-function(x){as.Date(x, origin='1970-01-01')} 

然後我lapply使用:

lapply(vf$sec, convFecha) 

我得到期望的結果:

[[1]] 
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" "2013-06-01" 

[[2]] 
[1] "2013-01-01" 

[[3]] 
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" 

在這一點上,我不知道如何創建的決賽桌。如果我嘗試將這個結果粘貼到我的表格中,它會再次以數字轉換日期。

vf$sec1<-lapply(vf$sec, convFecha) 

那麼,我必須將這些日期粘貼到vf的每一行嗎?有沒有其他的方式來獲得所需的表格?下一步到達桌面需要什麼?

回答

0

這是我嘗試的第一步,

tbl <- data.frame(id_cliente = c(1, 1, 1, 1, 2, 3, 3, 3), 
        fecha = c('2013-01-01', '2013-06-01', '2013-05-01', '2013-04-01', 
          '2013-01-01', '2013-01-01', '2013-05-01', '2013-04-01')) 

ddply(tbl, .(id_cliente), function(d) { 
    xMin <- min(as.Date(d$fecha)) 
    xMax <- max(as.Date(d$fecha)) 
    data.frame(fecha = format(seq(from=xMin, to=xMax, by='month'), format = "%d/%m/%Y")) 
}) 

輸出:

id_cliente  fecha 
1   1 01/01/2013 
2   1 01/02/2013 
3   1 01/03/2013 
4   1 01/04/2013 
5   1 01/05/2013 
6   1 01/06/2013 
7   2 01/01/2013 
8   3 01/01/2013 
9   3 01/02/2013 
10   3 01/03/2013 
11   3 01/04/2013 
12   3 01/05/2013 
1

這不是一個完整的答案,但使用by功能

out <- by(tbl, list(tbl$id_cliente), 
      function(x) seq(from=as.Date(min(x$fecha), , '%Y-%m-%d'), 
          to=as.Date(max(x$fecha), '%Y-%m-%d'), by='month')) 

> out 
: 1 
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01" 
[6] "2013-06-01" 
------------------------------------------------------- 
: 2 
[1] "2013-01-01" 
------------------------------------------------------- 
: 3 
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01" "2013-05-01"