【问题标题】:R- tapply doesn't keep dates formatedR-tapply 不保持日期格式
【发布时间】:2016-03-11 06:04:05
【问题描述】:

我需要通过 id_client 对日期进行快速聚合:最小值、最大值、月份日期差和月份数量。

示例表:

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

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

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

我仍然得到数字而不是日期。 我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: r function date tapply


    【解决方案1】:

    我知道这有点晚了,但我想我会把它放在这里给仍在谷歌搜索这个问题的人。

    有趣的是,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
    

    【讨论】:

      【解决方案2】:

      使用base R?Date 类将转换为自 1970 年 1 月 1 日起的天数。尝试使用 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
      

      【讨论】:

        猜你喜欢
        • 2015-02-26
        • 2020-03-12
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2020-08-24
        • 2020-08-14
        相关资源
        最近更新 更多