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

如何在分组data.frame中新增累计前序值的total_path列?

在分组data.frame中添加组内前序值累加列total_path

示例数据框

我们有如下分组数据框:

grouped_distances <- data.frame (
        group = c (rep ("A", 4), rep ("B", 2), rep ("C", 6)),
        day = c (1:4, 1:2, 1:6),
        distance = c (seq (0,6.5, length.out = 4), 
                   0, 3.6, 
                   0, (rnorm (5, mean = 3))^2) %>% round (digits = 1)
        )

输出结果:

group day distance
1      A   1      0.0
2      A   2      2.2
3      A   3      4.3
4      A   4      6.5
5      B   1      0.0
6      B   2      3.6
7      C   1      0.0
8      C   2     14.5
9      C   3     21.6
10     C   4      1.9
11     C   5      5.9
12     C   6     11.1

期望结果

需要添加total_path列,该列为每组内distance列从第一行到当前行的累加值:

group day distance total_path
1      A   1      0.0        0.0
2      A   2      2.2        2.2
3      A   3      4.3        6.5
4      A   4      6.5       13.0
5      B   1      0.0        0.0
6      B   2      3.6        3.6
7      C   1      0.0        0.0
8      C   2     13.7       14.5
9      C   3     13.6       36.1
10     C   4      4.8       38.0
11     C   5      8.6       43.9
12     C   6     13.9       55.0

尝试过的方法及问题

  1. 使用sum(distance)仅能得到组内总和,无法实现逐行累加:
grouped_distances %>% 
  dplyr::group_by(group) %>%
  dplyr::mutate(
      total_path = sum (distance) ,
  ) %>% 
    dplyr::ungroup ()

输出中total_path为每组distance的总和,不符合需求。

  1. 使用dplyr::lag()只能计算连续两行的差值或和,尝试sum(lag(distance[1:dplyr::row_number()]))的写法也无法正确实现累加。

解决方案

使用dplyr::cumsum()函数,分组后对distance列计算累积和即可实现需求:

library(dplyr)

grouped_distances %>% 
  group_by(group) %>%
  mutate(total_path = cumsum(distance)) %>%
  ungroup()

说明

  • group_by(group)确保累积和的计算范围限定在每个分组内
  • cumsum(distance)会对每组内的distance列从第一行开始逐行累加,正好对应你需要的"前序值求和"(包含当前行的累加结果)
  • 最终ungroup()可以取消分组状态,得到常规的data.frame结构

内容的提问来源于stack exchange,提问作者yenats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:54