如何在分组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
尝试过的方法及问题
- 使用
sum(distance)仅能得到组内总和,无法实现逐行累加:
grouped_distances %>% dplyr::group_by(group) %>% dplyr::mutate( total_path = sum (distance) , ) %>% dplyr::ungroup ()
输出中total_path为每组distance的总和,不符合需求。
- 使用
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
相关产品推荐
相关产品推荐

