如何在R语言中按组计算前序行的最大值?
分组计算每行及前序行的最大值(data.table/tidyverse实现)
问题背景
现有如下数据框,需新增一列End_multi,取值为同一组中当前行及之前所有行的End列最大值(注:根据期望输出修正需求表述,原描述的“当前行之前所有行”实际包含当前行):
Example <- data.frame(Group = c(rep(1, 6), rep(2, 6)), Individual = c("A", "B", "C", "A", "B", "C", "A", "C", "B", "A", "B", "C"), Start = c(15, 30, 35, 37, 50, 61, 66, 83, 88, 93, 108, 130), End = c(26, 48, 41, 44, 72, 64, 71, 95, 91, 94, 115, 150))
之前尝试的data.table代码存在两个问题:
- 仅取了前2行的滞后值,未覆盖组内所有前序行;
- 计算的是组内所有滞后值的全局最大值,而非到当前行的累积最大值。
期望输出如下:
Example_desired <- data.frame(Group = c(rep(1, 6), rep(2, 6)), Individual = c("A", "B", "C", "A", "B", "C", "A", "C", "B", "A", "B", "C"), Start = c(15, 30, 35, 37, 50, 61, 66, 83, 88, 93, 108, 130), End = c(26, 48, 41, 44, 72, 64, 71, 95, 91, 94, 115, 150), End_multi = c(26, 48, 48, 48, 72, 72, 71, 95, 95, 95, 115, 150))
解决方案
1. data.table 实现
使用cummax()函数直接计算分组内的累积最大值,这是最简洁高效的方式:
library(data.table) Example_dt <- as.data.table(Example) # 分组计算累积最大值 Example_dt[, End_multi := cummax(End), by = Group]
2. tidyverse 实现
结合dplyr的group_by()和mutate(),配合cummax()完成计算:
library(dplyr) Example_tidy <- Example %>% group_by(Group) %>% mutate(End_multi = cummax(End)) %>% ungroup()
验证结果
运行上述代码后,可通过以下代码验证结果与期望输出一致:
# data.table验证 all.equal(Example_dt, as.data.table(Example_desired)) # tidyverse验证 all.equal(Example_tidy, Example_desired)
内容的提问来源于stack exchange,提问作者KrisAnathema
相关产品推荐
相关产品推荐

