【问题标题】:Incrementally increasing date using lag function for missing dates only仅对缺失日期使用滞后函数递增日期
【发布时间】:2020-11-12 17:03:59
【问题描述】:

在下面的示例中,我想使用前几天和effort 变量中携带的整数值导出缺失日期,仅用于缺失日期。

# Libraries
library("tidyverse")
library("lubridate")

work_start_date <- dmy("2/11/2020")

dta_tasks <- tribble(
  ~task_no, ~task,  ~effort,
  1,   "Task 1", NA,
  1.1, "Task 1.1", 1,
  1.3, "Task 1.3", 1,
  1.4, "Task 1.4", 2,
  1.5, "Task 1.5", 1,
  2,   "Task 2",   NA,
  2.1, "Task 2.1", 2

)

dta_tasks %>%
  arrange(task_no) %>%
  mutate(start_date = if_else(row_number() == 1, work_start_date, NA_Date_),
         start_date = if_else(is.na(start_date), lag(start_date) + days(effort), start_date))

期望的结果

task_no task     effort start_date
<dbl> <chr>     <dbl> <date>    
1     1   Task 1      NA 2020-11-02
2     1.1 Task 1.1      1 2020-11-03
3     1.3 Task 1.3      1 2020-11-04        
4     1.4 Task 1.4      2 2020-11-06        
5     1.5 Task 1.5      1 2020-11-07        
6     2   Task 2       NA 2020-11-08        
7     2.1 Task 2.1      2 2020-11-08  # For NA it has to skip value 

细化

在以下代码的上下文中,我想将Sys.Date() 替换为之前的计算日期。

dta_tasks %>%
  arrange(task_no) %>%
  mutate(
    start_date = if_else(row_number() == 1, work_start_date, NA_Date_),
    start_date = if_else(is.na(start_date), Sys.Date() + days(effort), start_date)
  )

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    试试这个:

    dta_tasks %>%
        arrange(task_no) %>% 
        mutate(effort_no_na = pmax(effort, 0, na.rm = TRUE)) %>% 
        mutate(cum_effort = cumsum(effort_no_na),
               start_date = work_start_date + days(effort_no_na),
               start_date = if_else(is.na(effort), NA_Date_, start_date)) %>% 
        fill(start_date, .direction =  "up")
    

    这个想法是使用cumsum 来跟踪自开始以来的总工作量。由于 NA,需要进行大量簿记。

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多