代码之家  ›  专栏  ›  技术社区  ›  Chris Ruehlemann

如何从持续时间计算临时连续分组事件的开始时间和结束时间

  •  0
  • Chris Ruehlemann  · 技术社区  · 5 年前

    dur 临时连续分组事件的平均值:

    df <- data.frame(
      grp = c("A", "B", "A", "C", "C", "A", "B", "A"),
      dur = c(111,222,33,10,555,333,600,222)
    )
    

    我需要做的是计算分组事件的开始时间和结束时间。所有我 可以 0 对于每个 grp ):

    library(dplyr)
    df %>%
      group_by(grp) %>%
      mutate(
        Endtime = cumsum(dur)
      )
    # A tibble: 8 x 3
    # Groups:   grp [3]
      grp     dur Endtime
      <chr> <dbl>   <dbl>
    1 A       111     111
    2 B       222     222
    3 A        33     144
    4 C        10      10
    5 C       555     565
    6 A       333     477
    7 B       600     822
    8 A       222     699
    

    如何计算开始时间?

    :

    df %>%
      group_by(grp) %>%
      mutate(
        Endtime = cumsum(dur),
        Starttime = Endtime -dur
      )
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   AnilGoyal    5 年前
    df <- data.frame(
      grp = c("A", "B", "A", "C", "C", "A", "B", "A"),
      dur = c(111,222,33,10,555,333,600,222)
    )
    
    library(dplyr, warn.conflicts = F)
    df %>%
      group_by(grp) %>%
      mutate(starttime = lag(cumsum(dur), default = 0) + 1,
        Endtime = cumsum(dur)
      )
    #> # A tibble: 8 x 4
    #> # Groups:   grp [3]
    #>   grp     dur starttime Endtime
    #>   <chr> <dbl>     <dbl>   <dbl>
    #> 1 A       111         1     111
    #> 2 B       222         1     222
    #> 3 A        33       112     144
    #> 4 C        10         1      10
    #> 5 C       555        11     565
    #> 6 A       333       145     477
    #> 7 B       600       223     822
    #> 8 A       222       478     699
    

    或者从0开始

    df %>%
      group_by(grp) %>%
      mutate(starttime = lag(cumsum(dur), default = 0),
        Endtime = cumsum(dur)
      )
    #> # A tibble: 8 x 4
    #> # Groups:   grp [3]
    #>   grp     dur starttime Endtime
    #>   <chr> <dbl>     <dbl>   <dbl>
    #> 1 A       111         0     111
    #> 2 B       222         0     222
    #> 3 A        33       111     144
    #> 4 C        10         0      10
    #> 5 C       555        10     565
    #> 6 A       333       144     477
    #> 7 B       600       222     822
    #> 8 A       222       477     699
    

    于2021-07-03由 reprex package (2.0.0版)