分享
三行代码  ›  专栏  ›  技术社区  ›  biostatguy12

创建重置为1的count连续变量 - Create a count-consecutive variable which resets to 1

r
  •  1
  • biostatguy12  · 技术社区  · 1 周前

    我有一个如下所示的数据集,其中“group”是一个组变量。我想按组计算“下一天”的天数,但如果不是第二天,我想将计数重置为一天(如“想要”列中所示)。然后,我想返回“want”列的最大数目(如want2所示)。如有建议,将不胜感激!

    df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2), 
                   date=c("2000-01-01", "2000-01-03", "2000-01-04", "2000-01-05", "2000-01-09", "2000-01-10", "2000-01-12"),
                   want=c(1,1,2,3,1,2,1),
                   want2=c(3,3,3,3,2,2,2))
    
    1 回复  |  直到 1 周前
        1
  •  1
  •   akrun    1 周前

    一个选项是按“group”分组,然后使用 diff Date 类Convered'Date',创建逻辑向量并使用 cumsum 要在“want”(“wantn”)中复制结果,然后使用“wantn”,请应用 max 在上面

    library(dplyr)
    library(data.table)
    df %>% 
       group_by(group) %>%
       mutate(wantn = rowid(cumsum(c(TRUE, diff(as.Date(date)) !=1))), 
              want2n = max(wantn))
    # A tibble: 7 x 6
    # Groups:   group [2]
    #  group date        want want2 wantn want2n
    #  <dbl> <fct>      <dbl> <dbl> <int>  <int>
    #1     1 2000-01-01     1     3     1      3
    #2     1 2000-01-03     1     3     1      3
    #3     1 2000-01-04     2     3     2      3
    #4     1 2000-01-05     3     3     3      3
    #5     2 2000-01-09     1     2     1      2
    #6     2 2000-01-10     2     2     2      2
    #7     2 2000-01-12     1     2     1      2
    

    或者如果我们不想使用 rowid ,然后使用 累加 然后得到序列

    df %>%
        group_by(group) %>%
        group_by(group2 = cumsum(c(TRUE, diff(as.Date(date)) !=1)), add = TRUE) %>%
        mutate(wantn = row_number()) %>%
        group_by(group) %>%
        mutate(want2n = max(wantn)) %>%       
        select(-group2)