1

次の出発点があります。

#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それが最初の行で行われたら、最初の行のを 2 番目の行にしたいと思いstartます。

さまざまなアプローチを試してきましたが、これまでのところ成功していません。私が検討したことは次のとおりです。

  • endlag(end) 関数を使用して前の行から を取得します。これは 2 行目では正常に機能しますが、後続のすべての行でendはまだ存在しません。
  • 実験しましrowwise()たが、この場合、機能が機能しませんlag()

次のコードは、多かれ少なかれやりたいことを実行しますが、行ごとに変更を追加する必要があるため、これはあまりきれいではありません (その後、前のすべての行が再計算されます)。

> 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)))
  )

とにかく、私は少し立ち往生しており、これにアプローチする方法について誰かが賢明なアイデアを持っていることを願っていますか?

4

3 に答える 3