首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R- tapply不保留日期格式

R- tapply不保留日期格式
EN

Stack Overflow用户
提问于 2015-12-06 16:44:17
回答 2查看 777关注 0票数 2

我需要做一个快速聚合id_client的日期:最小,最大,日期差的月份和数量的月份。

示例表:

代码语言:javascript
复制
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'))

格式日期:

代码语言:javascript
复制
tbl$fecha<-as.Date(as.character(tbl$fecha))

我的第一种方法是步履蹒跚:

代码语言:javascript
复制
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')))

我得到了想要的结果,但是用我真正的桌子需要太多的时间。所以我试了一下:

代码语言:javascript
复制
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)
        ))

结果是:

代码语言:javascript
复制
> tbl3
  dif hay   min   max
   6   4 15706 15857
   1   1 15706 15706
   5   3 15706 15826

在这种情况下,我得到的不是日期,而是数字。因此,由于下面的工作,我尝试在tapply中使用as.Date:

代码语言:javascript
复制
as.Date(15706, origin='1970-01-01')

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

该函数可以工作,但对于tapply则不起作用。

代码语言:javascript
复制
tbl3<-data.frame(cbind(min=tapply(tbl$fecha, list(tbl$id_cliente), MIN)))

我还有电话号码而不是日期。我怎么才能解决这个问题?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-06 17:08:03

使用base R,从1970年1月1日起,?Date类被转换为天数。尝试使用dplyrdata.table来保留date类:

dplyr

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-07-08 07:39:27

我知道这有点晚了,但我想我应该把这个放在这里,因为人们仍然在谷歌这个问题。

有趣的是,当您将date列保持为文本格式时,tapply返回正确的结果,然后可以在以下之后转换为日期:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34119968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档