dplyr对同一列使用mutate + lag

时间:2019-09-10 19:29:15

标签: r dplyr

我正在尝试使用dplyrmutatelag函数来基于另一个列和我正在创建的列中的先前值来创建燃尽图。

我看到了一个答案here,它要求相同的内容,但是OP自己使用循环来回答了这个问题。我希望在dplyr中有更雄辩的解决方案。

样本(假设df有1000行):

      df <- data.frame(SCHED_SHIP_DATE = c("2019-09-10","2019-09-11","2019-09-12","2019-09-13"), quantity = c(156,52,136,285), stringsAsFactors = FALSE)

      start <- 4000

      temp3 <- df %>%
        arrange(SCHED_SHIP_DATE) %>%
        mutate(burndown = ifelse(row_number() == 1, start, NA)) %>%
        mutate(burndown = lag(burndown, default = burndown[1]) - quantity)

我得到以下输出({NA是完成一行突变后的输出):

> temp3
  SCHED_SHIP_DATE quantity burndown
1      2019-09-10      156     3844
2      2019-09-11       52     3948
3      2019-09-12      136       NA
4      2019-09-13      285       NA

当我期望这一点时:

> temp3
  SCHED_SHIP_DATE quantity burndown
1      2019-09-10      156     3844
2      2019-09-11       52     3948
3      2019-09-12      136     3812
4      2019-09-13      285     3527

1 个答案:

答案 0 :(得分:0)

我认为您想要的输出有点错误。这可能就是您需要的-

df %>%
  arrange(SCHED_SHIP_DATE) %>% 
  mutate(
    burndown = 4000 - cumsum(quantity)
    # burndown = pmax(4000 - cumsum(quantity), 0) # use this if you don't want -ve burndown
  )

  SCHED_SHIP_DATE quantity burndown
1      2019-09-10      156     3844
2      2019-09-11       52     3792
3      2019-09-12      136     3656
4      2019-09-13      285     3371