如何有效地计算开始和结束日期的顺序?

时间:2018-07-11 12:16:47

标签: r dplyr lag rowwise

我有以下起点:

#dataset:
schedule <- tibble(start = as.Date(c("2018-07-11", NA, NA)), duration = c(10,23,9),flag_StartActual = c(TRUE,FALSE,FALSE))

以表格格式:

> schedule
# A tibble: 3 x 3
  start      duration flag_StartActual
  <date>        <dbl> <lgl>           
1 2018-07-11       10 TRUE            
2 NA               23 FALSE           
3 NA                9 FALSE   

我想计算end(=开始+持续时间)。对于第一行完成此操作后,我想使第一行的end成为第二行的start

我已经尝试了各种方法,但是到目前为止,我还没有成功。我考虑过的是:

  • 使用lag(end)函数从上一行获取end。这对于第二行工作正常,但对于随后的所有行,end尚不存在。
  • 我已经尝试过rowwise(),但是在这种情况下,我无法使用lag()函数。

以下代码或多或少做了我想做的事情,但这并不是很整洁,因为需要为每行添加一个mutate(然后重新计算所有先前的行)。

> schedule %>%
+   mutate(
+     end = start + ddays(duration),
+     start = as_datetime(ifelse(flag_StartActual==TRUE,start,lag(end)))
+   )  %>%
+   mutate(
+     end = start + ddays(duration),
+     start = as_datetime(ifelse(flag_StartActual==TRUE,start,lag(end)))
+   )
# A tibble: 3 x 4
  start               duration flag_StartActual end                
  <dttm>                 <dbl> <lgl>            <dttm>             
1 2018-07-11 00:00:00       10 TRUE             2018-07-21 00:00:00
2 2018-07-21 00:00:00       23 FALSE            2018-08-13 00:00:00
3 2018-08-13 00:00:00        9 FALSE            NA                 

在下面的代码中包含rowwise()无效:

schedule %>%
  rowwise() %>%
  mutate(
    end = start + ddays(duration),
    start = as_datetime(ifelse(flag_StartActual==TRUE,start,lag(end)))
  )

无论如何,我有点困惑,希望有人对如何解决这个问题有一些聪明的想法?

3 个答案:

答案 0 :(得分:3)

<div class="panel-heading">
    <div class="row">
        <h2 id="exerciseTitleCMS" class="col-md-8 col-sm-7 col-xs-6">Content Managment System</h2>
    </div>
</div>      <!-- end of panel-heading -->

答案 1 :(得分:1)

圈起来:

for (i in 2:nrow(schedule)) 
    schedule$start[i]<-schedule$start[i-1]+schedule$duration[i-1] 
schedule$end<-schedule$start+schedule$duration
schedule

# A tibble: 3 × 4
       start duration flag_StartActual        end
      <date>    <dbl>            <lgl>     <date>
1 2018-07-11       10             TRUE 2018-07-21
2 2018-07-21       23            FALSE 2018-08-13
3 2018-08-13        9            FALSE 2018-08-22

请注意,在计算完所有起点之后,我创建了end列,我认为这要容易一些。

答案 2 :(得分:1)

.value