如何按组从末行到首行计算cumsum(累积和)
按分组从后向前计算
val列累积和的R实现 嘿,我来帮你搞定这个按var分组、从数据框最后一行往前算val列累积和的需求!咱们一步步来:
首先看示例数据
先把你给出的示例数据用R代码定义出来:
t1 <- data.frame(var = "a", val = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0,0)) t2 <- data.frame(var = "b", val = c(0,0,0,0,1,0,0,1,0,0,0,0,0,0,0)) ts <- rbind(t1, t2)
实现思路
要实现从后往前的累积和,其实可以换个巧妙的思路:把每个分组的val列先倒序排列,用常规的cumsum()计算累积和,再把结果倒序回来——这样就相当于从原数据的最后一行开始往前累积啦!
用dplyr包实现(推荐)
如果你习惯用tidyverse系列的工具,用dplyr的分组操作非常直观,而且能直接得到和你期望完全一致的数据框:
library(dplyr) # 按var分组,直接更新val列为从后往前的累积和 result <- ts %>% group_by(var) %>% mutate(val = rev(cumsum(rev(val)))) %>% ungroup()
运行这段代码后,result就是你想要的最终结果,和你给出的示例完全匹配~
用Base R实现(无需额外包)
如果你不想加载第三方包,用Base R的by()函数也能轻松实现:
# 按var分组处理val列,计算从后往前的累积和 updated_val <- unlist(by(ts$val, ts$var, function(x) rev(cumsum(rev(x))))) # 替换原数据框的val列 ts$val <- updated_val
这样处理后,原ts数据框就变成了你期望的格式。
内容的提问来源于stack exchange,提问作者adl
相关产品推荐
相关产品推荐

