R语言按分组逐行计算hs^seq*th累积求和的实现方法
R语言按分组计算组内累计累加值实现方案
需求说明
现有数据集需要按group字段分组,对每行计算从组内首行到当前行的指定规则累加值,生成新列an。
计算规则:每行an值为同组内从第一行到当前行,所有行的hs的seq次方乘以th的结果之和。
示例数据构造
demo<-data.frame(th=c(c(0,24,26),(c(0,1,2,4))),hs=c(rep(220,3),c(rep(240,4))), seq=(c(1:3,1:4)),group=c(rep(1,3),rep(2,4)))
原始数据集预览:
> demo th hs seq group 1 0 220 1 1 2 24 220 2 1 3 26 220 3 1 4 0 240 1 2 5 1 240 2 2 6 2 240 3 2 7 4 240 4 2
计算逻辑说明
# 单条计算示例 demo[1,"an"]<- demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"] demo[2,"an"]<-sum(demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"], demo[2,"hs"]^demo[2,"seq"] * demo[2,"th"] ) demo[3,"an"]<-sum(demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"], demo[2,"hs"]^demo[2,"seq"] * demo[2,"th"], demo[3,"hs"]^demo[3,"seq"] * demo[3,"th"])
实现代码
方法1:dplyr包实现(推荐,代码简洁易读)
library(dplyr) demo <- demo %>% group_by(group) %>% # 先计算每行的单个项,再做累计求和 mutate(an = cumsum(hs^seq * th)) %>% ungroup()
方法2:基础R实现(无需加载额外包)
demo$an <- ave(demo$hs^demo$seq * demo$th, demo$group, FUN = cumsum)
最终输出结果(已补全所有NA值)
> demo th hs seq group an 1 0 220 1 1 0 2 24 220 2 1 1161600 3 26 220 3 1 278009600 4 0 240 1 2 0 5 1 240 2 2 57600 6 2 240 3 2 27705600 7 4 240 4 2 13298745600
内容的提问来源于stack exchange,提问作者CrunchyTopping
相关产品推荐
相关产品推荐

