R-tapply不';不要把日期格式化

R-tapply不';不要把日期格式化,r,function,date,tapply,R,Function,Date,Tapply,我需要按id_客户端对日期进行快速聚合:最小值、最大值、月内日期差和月数 示例表: 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')) 在这种情况下,我得到的不是日期,而是数字。因此,由于以下工作,我尝试在tap

我需要按id_客户端对日期进行快速聚合:最小值、最大值、月内日期差和月数

示例表:

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'))
在这种情况下,我得到的不是日期,而是数字。因此,由于以下工作,我尝试在tapply中使用as.Date:

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

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

MIN使用
基本R
日期
类转换为1970年1月1日起的天数。尝试使用
dplyr
data.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
数据表

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

我知道这有点晚了,但我想我会把它放在这里,让那些还在谷歌上搜索这个问题的人看看

有趣的是,
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'))
tbl3<-data.frame(cbind(dif=tapply(tbl$fecha, list(tbl$id_cliente), seq),
                        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))) 
head(tbl3)
#         dif hay        min        max
# 1, 2, 3, 4   4 2013-01-01 2013-06-01
#          1   1 2013-01-01 2013-01-01
#    1, 2, 3   3 2013-01-01 2013-05-01
tbl
as.Date(15706, origin='1970-01-01')

MIN<-function(x){as.Date(min(x), origin='1970-01-01')}
tbl3<-data.frame(cbind(min=tapply(tbl$fecha, list(tbl$id_cliente), MIN)))
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
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
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'))
tbl3<-data.frame(cbind(dif=tapply(tbl$fecha, list(tbl$id_cliente), seq),
                        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))) 
head(tbl3)
#         dif hay        min        max
# 1, 2, 3, 4   4 2013-01-01 2013-06-01
#          1   1 2013-01-01 2013-01-01
#    1, 2, 3   3 2013-01-01 2013-05-01