我有以下起点:
#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
。
我已经尝试了各种方法,但是到目前为止,我还没有成功。我考虑过的是:
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)))
)
无论如何,我有点困惑,希望有人对如何解决这个问题有一些聪明的想法?
答案 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