dplyr 对同一列使用 mutate + lag
Posted
技术标签:
【中文标题】dplyr 对同一列使用 mutate + lag【英文标题】:dplyr using mutate + lag for the same column 【发布时间】:2020-01-12 14:03:32 【问题描述】:我正在尝试使用 dplyr
和 mutate
和 lag
函数来创建基于另一列和我正在创建的列中的先前值的燃尽图。
我看到一个答案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
's 在它完成了一行变异之后):
> 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
【问题讨论】:
用mutate(burndown = start - quantity)
替换最后两行不是给你预期的答案吗?
【参考方案1】:
我认为您想要的输出有点错误。这就是你可能需要的 -
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
【讨论】:
感谢@Shree,您对我上面的输出是正确的。我什至没有注意到它不正确。完美答案!以上是关于dplyr 对同一列使用 mutate + lag的主要内容,如果未能解决你的问题,请参考以下文章
使用 dplyr::mutate 对数据帧进行 Fisher 的测试统计
R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战
dplyr 中的 mutate_each / summarise_each:如何选择某些列并为变异列赋予新名称?
R语言dplyr包mutate_at函数通过名称修改指定数据列的内容(使用统一的函数)实战
R语言dplyr处理dataframe:使用mutate函数生成新的列recode函数进行数据编码rename函数重命名字段arrange排序数据列select筛选数据filter过滤数据