【问题标题】:Calculate total elapsed time计算总经过时间
【发布时间】:2020-12-01 02:47:51
【问题描述】:

我有以下数据:

library(dplyr, warn.conflicts = FALSE)

df <- tibble(
  x = c(30, 60, 90, 30, 60, 90),
  phase = c(rep(c("phase 1", "phase 2"), each = 3))
)

df
#> # A tibble: 6 x 2
#>       x phase  
#>   <dbl> <chr>  
#> 1    30 phase 1
#> 2    60 phase 1
#> 3    90 phase 1
#> 4    30 phase 2
#> 5    60 phase 2
#> 6    90 phase 2

reprex package (v0.3.0) 于 2020-08-11 创建

其中x 是每个phase 内经过的时间(以秒为单位)。由于phase 是连续发生的事情,我有兴趣计算总经过时间

期望的输出:

#> # A tibble: 6 x 3
#>       x phase   elapsed_time
#>   <dbl> <chr>          <dbl>
#> 1    30 phase 1           30
#> 2    60 phase 1           60
#> 3    90 phase 1           90
#> 4    30 phase 2          120
#> 5    60 phase 2          150
#> 6    90 phase 2          180

有什么想法吗?请注意,我的真实示例有更多阶段

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    这是来自dplyr 的一个想法。首先,我们需要按phase 分组并获取每个的时差。然后我们将ungroup()cumsum() 作为一个总数,即

    library(dplyr)
    
    df %>% 
     group_by(phase) %>% 
     mutate(diffs = x - lag(x, default = 0)) %>% 
     ungroup() %>% 
     mutate(res = cumsum(diffs)) %>% 
     select(-diffs)
    
    # A tibble: 6 x 3
    #      x phase     res
    #  <dbl> <chr>   <dbl>
    #1    30 phase 1    30
    #2    60 phase 1    60
    #3    90 phase 1    90
    #4    30 phase 2   120
    #5    60 phase 2   150
    #6    90 phase 2   180
    

    【讨论】:

      【解决方案2】:

      我相信以下帖子有您正在寻找的答案:

      How to add a cumulative column to an R dataframe using dplyr?

      它展示了如何使用group_bymutate 创建一个累积列。看来您希望两个阶段的经过时间相加,所以不要在代码中包含 group_by 调用。

      【讨论】:

        【解决方案3】:

        这是另一个dplyr 解决方案。它找到每个阶段的开始,并将其添加到 x

        library(tidyverse)
        df <- tibble(
          x = c(30, 60, 90, 30, 60, 90),
          phase = c(rep(c("phase 1", "phase 2"), each = 3))
        )
        
        df %>% group_by(phase) %>% 
          nest() %>% 
          mutate(start = map_dbl(data, max)) %>% 
          ungroup() %>% 
          mutate(start = lag(start, default = 0)) %>% 
          unnest(data) %>% 
          mutate(elapsed_time = start + x) %>% 
          select(-start)
        #> # A tibble: 6 x 3
        #>   phase       x elapsed_time
        #>   <chr>   <dbl>        <dbl>
        #> 1 phase 1    30           30
        #> 2 phase 1    60           60
        #> 3 phase 1    90           90
        #> 4 phase 2    30          120
        #> 5 phase 2    60          150
        #> 6 phase 2    90          180
        

        reprex package (v0.3.0) 于 2020-08-11 创建

        【讨论】:

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