【问题标题】:Can I cross tab dates, grouped by year?我可以交叉表日期,按年份分组吗?
【发布时间】:2015-08-23 06:09:01
【问题描述】:

我通过 SO 的 some help 清除了一个障碍,并认为下一个障碍会更容易。我真正拥有的是数据框中的开始结束日期:

require(lubridate)

demo <- read.table(text = "
start   end num
2010-12-31        <NA>  35
2013-04-01        <NA>  34
2015-06-02        <NA>  34
2015-06-15  2012-12-31  34
2015-01-30  2011-12-31  33
2014-04-15  2013-12-31  33
2014-05-28  2013-12-31  33
2014-06-02        <NA>  33
2015-06-17        <NA>  33
2015-06-25        <NA>  33
2015-06-24        <NA>  32
2013-07-31        <NA>  32
2013-08-31        <NA>  32
2015-04-27        <NA>  31
2015-05-07        <NA>  31
2013-12-30        <NA>  31
2014-11-21        <NA>  30
2013-12-20  2013-06-30  30
",header = TRUE, sep = "")

demo$start <- as.Date(demo$start, '%Y-%m-%d')
demo$end <- as.Date(demo$end, '%Y-%m-%d')

我可以使用table(year(demo$end))table(year(demo$start)) 获取开始年份表或结束年份表,这是一个不错的开始。但我真正想知道的更像是:每一年,有多少开始的条目尚未结束?所以在每个开始年计算is.na()

我以为我可以为此使用 aggregate(),但是这个:

aggregate(is.na(end) ~ year(start), demo, FUN = length)

但这似乎计算了每一次观察,而不仅仅是结束日期is.na()的观察

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    您可以使用带有多个参数的表来为您提供 2 路或多路表:

    > with(demo, table( year=format(demo$start, "%Y"), Not.missing = !is.na(end) ) )
          Not.missing
    year   FALSE TRUE
      2010     1    0
      2013     4    1
      2014     2    2
      2015     6    2
    

    您也可以使用lubridate::year 代替 hte 格式调用。

    【讨论】:

      【解决方案2】:

      如果您需要查找每个“年份”的 NA 值的数量,我们可以使用sum,因为is.na(end) 是一个逻辑向量。 length 给出每个 year 的向量的总长度,而不是 TRUE 值的 length

      aggregate(cbind(end=is.na(end)) ~ cbind(year=year(start)), demo, FUN = sum)
      #  year end
      #1 2010   1
      #2 2013   4
      #3 2014   2
      #4 2015   6
      

      或者我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(demo)),按'start'列的year分组,并使用i作为is.na(end)作为行索引,我们得到@987654333 @ 或每个组的元素数。

      library(data.table)
      setDT(demo)[is.na(end), list(end = .N) , list(year=year(start))]
      #   year end
      #1: 2010   1
      #2: 2013   4
      #3: 2015   6
      #4: 2014   2
      

      【讨论】:

        【解决方案3】:

        这是另一种选择:

        library(dplyr)
        library(lubridate)
        demo %>% subset(is.na(end)) %>% group_by(year(start)) %>% summarise(n=length(end))
        #Source: local data frame [4 x 2]
        #
        #  year(start) n
        #1        2010 1
        #2        2013 4
        #3        2014 2
        #4        2015 6
        

        这很简单。使用您的原始数据(演示),subset 仅在您的 end 列中获取 NA。然后(并使用lubridate 包中的year()),按每个year 分组,并获取end 列中存在的NAs 数量的摘要。这将返回一个data.frame 对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多