You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:13:15