【问题标题】:Count records per group within date lag在日期滞后内计算每组的记录
【发布时间】:2021-06-17 01:16:01
【问题描述】:

我有一个大型数据集,结构如下

dat <- data.frame("Date" = c("2017-01-01", "2017-01-20", "2017-04-15", "2017-11-03", "2018-01-03", "2019-12-12", "2020-03-07", "2014-05-19", "2009-07-03", "2010-02-04"), 
                  "Region" = c("Adelaide", "Albany", "Albany", "Albany", "Albany", "Albany", "Albany", "Middleton", "Alice Springs", "Alice Springs"))

dat$Date <- as.Date(dat$Date, "%Y-%m-%d")

对于每条记录,如果它们在过去 12 个月内并且仅当它们在同一区域内时,我想计算它们的数量。任何帮助实现这一点将不胜感激?

我的最终数据集应该看起来与原始数据集相同,但添加了以下计数列

dat$Count <- c(0, 0, 1, 2, 3, 0, 1, 0, 0, 1)

此计数列显示,对于数据集中的第一条记录,在过去 12 个月中没有来自同一地区的其他记录,但是对于数据集中的第 5 条记录,在过去 12 个月中出现的其他记录有 3 条同一地区的月份。

我在dplyr 中使用group_by()count()summarise() 尝试了一系列解决方案,但还没有达到我的意图。

【问题讨论】:

    标签: r


    【解决方案1】:

    对于每个Region,您可以获取当前日期与所有其他日期的差,并计算 0 到 365 天之间的日期数。

    library(dplyr)
    library(purrr)
    
    dat %>%
      group_by(Region) %>%
      mutate(Count = map_dbl(row_number(), 
                       ~sum(between(Date[.x] - Date[-.x], 0, 365)))) %>%
      ungroup
    
    #    Date       Region        Count
    #   <date>     <chr>         <dbl>
    # 1 2017-01-01 Adelaide          0
    # 2 2017-01-20 Albany            0
    # 3 2017-04-15 Albany            1
    # 4 2017-11-03 Albany            2
    # 5 2018-01-03 Albany            3
    # 6 2019-12-12 Albany            0
    # 7 2020-03-07 Albany            1
    # 8 2014-05-19 Middleton         0
    # 9 2009-07-03 Alice Springs     0
    #10 2010-02-04 Alice Springs     1
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      dat %>%
        group_by(Region) %>%
        mutate(a = accumulate(c(0, diff(Date)), ~if(.x+.y < 365).x+.y else 0))%>%
        group_by(Count = cumsum(a==0)) %>%
        mutate(Count = seq(n())- 1, a = NULL)
               
        Date       Region        Count
         <date>     <chr>         <dbl>
       1 2017-01-01 Adelaide          0
       2 2017-01-20 Albany            0
       3 2017-04-15 Albany            1
       4 2017-11-03 Albany            2
       5 2018-01-03 Albany            3
       6 2019-12-12 Albany            0
       7 2020-03-07 Albany            1
       8 2014-05-19 Middleton         0
       9 2009-07-03 Alice Springs     0
      10 2010-02-04 Alice Springs     1
      

      你也可以这样做:

      library(data.table)
      
      setDT(dat)
      dat[, Count := c(0, diff(Date)), Region][,
            Count := rowid(cumsum(replace(Count, Count>365, 0) == 0))-1]
      

      【讨论】:

      • 感谢@Onyambu,但您的第一个建议对我不起作用。如果我运行我的第一段代码来加载dat 并分类dat$Date 然后我运行你的第一段代码我得到dat$Count 作为以下向量c(0, 1, 2, 3, 4, 0, 1, 5, 6, 7)
      猜你喜欢
      • 2016-05-18
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多