r - dplyr 对同一列使用 mutate + lag
问题描述
我正在尝试使用dplyr
它mutate
和lag
功能来创建基于另一列和我正在创建的列中的先前值的燃尽图。
我在这里看到了一个 要求相同内容的答案,但 OP 使用循环自己回答了这个问题。我希望有一个更雄辩的解决方案 inside 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
解决方案
我认为您想要的输出有点错误。这就是你可能需要的——
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
推荐阅读
- angular - Angular6 升级问题:“对象”类型上不存在属性“数据”
- mysql - 从第一个表到第二个表引用多个行ID,以便每次都可以显示第一个表中的所有行
- bash - Bash:蜘蛛模式下的 wget 不输出任何内容
- docker - Traefik + 码头工人。www.domain.tld 有效,domain.tld 无效
- log4j2 - Log4j2 不通过附加程序记录 Faces 异常
- drupal - drupal 7 taxonomy_vocabulary_machine_name_load 未显示字段
- android - Android - 未调用 TabLayout 侦听器回调
- php - 如何使 Pygame 游戏在线可执行?
- python - 无法安装图案
- spotify - 通过 Spotify API 获取流总数和跟踪发布日期