2015-12-06 54 views
1

我需要通過id_client快速彙總日期:最小值,最大值,月份差異和月數量。R- tapply不保留日期格式

示例表:

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)) 

我的第一種方法是ddply:

tbl2<-ddply(tbl, .(id_cliente), summarize, cant=length(id_cliente), 
max=max(fecha), min=min(fecha), 
dif=length(seq(from=min, to=max, by='month'))) 

我得到了想要的結果,但我真正的表需要太多很多時間。 所以,我想tapply:

tbl3<-data.frame(cbind(dif=tapply(tbl$fecha, list(tbl$id_cliente), secuencia), 
     hay=tapply(tbl$fecha, list(tbl$id_cliente), length), 
     min=tapply(tbl$fecha, list(tbl$id_cliente), min), 
     max=tapply(tbl$fecha, list(tbl$id_cliente), max) 
     )) 

結果是:

> tbl3 
    dif hay min max 
    6 4 15706 15857 
    1 1 15706 15706 
    5 3 15706 15826 

在這種情況下,我得到的,而不是日期,數字。因此,由於以下工作,我嘗試使用asapate內tapply:

as.Date(15706, origin='1970-01-01') 

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

該函數可以工作,但與tapply不。

tbl3<-data.frame(cbind(min=tapply(tbl$fecha, list(tbl$id_cliente), MIN))) 

而且我仍然得到了數字而不是日期。 我該如何解決這個問題?謝謝。

回答

0

隨着base R,所述?Date類是從1月1日轉化爲天數,1970嘗試使用dplyrdata.table保留日期類:

dplyr

library(dplyr) 
tbl %>% group_by(id_cliente) %>% 
     summarise(dif=length(seq(min(fecha), max(fecha), by='month')), 
        hay=length(fecha), 
        min=min(fecha), 
        max=max(fecha)) 
# Source: local data frame [3 x 5] 
# 
# id_cliente dif hay  min  max 
# 1   1 6 4 2013-01-01 2013-06-01 
# 2   2 1 1 2013-01-01 2013-01-01 
# 3   3 5 3 2013-01-01 2013-05-01 

data.table

library(data.table) 
setDT(tbl)[,.(dif=length(seq(min(fecha), max(fecha), by='month')), 
       hay= .N, 
       min=min(fecha), 
       max=max(fecha)), by=id_cliente] 
# id_cliente dif hay  min  max 
# 1:   1 6 4 2013-01-01 2013-06-01 
# 2:   2 1 1 2013-01-01 2013-01-01 
# 3:   3 5 3 2013-01-01 2013-05-01