如何按ID与Rep分组、按Age时序计算婴儿数累积和?
解决方法
你的问题出在ave函数的分组参数上,你错误地把id、age重复组合作为分组依据,正确的分组应该是id + rep的组合,同时要确保每个分组内的行是按age升序排列的(否则累积和会乱序)。
以下是两种可行的解决方案:
方法1:Base R 实现
先按id、rep、age排序,再用ave按id和rep分组计算累积和:
id <- c("A","A","A","A","A","A","B","B","B","B","B","B","B","B","B") rep <- c(1,1,1,2,2,2,1,1,1,1,2,2,2,2,2) age <- c(0,1,2,0,1,2,0,1,2,3,0,1,2,3,4) babies <- c(1,2,3,0,1,3,0,1,5,1,0,0,12,1,1) df <- data.frame(id, rep, age, babies) # 先按id、rep、age排序,保证累积和的顺序正确 df <- df[order(df$id, df$rep, df$age), ] # 按id和rep分组计算累积和 df$csum <- ave(df$babies, list(df$id, df$rep), FUN = cumsum)
运行后你会看到A1组的csum是1、3、6,符合预期。
方法2:dplyr 实现(更直观)
如果你习惯用tidyverse工具,用dplyr的分组和突变函数会更清晰:
library(dplyr) df <- df %>% arrange(id, rep, age) %>% # 确保每组内age升序 group_by(id, rep) %>% # 按id和rep分组 mutate(csum = cumsum(babies)) %>% # 计算累积和 ungroup() # 取消分组(可选,根据后续操作需求)
这种方法代码可读性更强,分组逻辑一目了然。
验证结果
以A1组为例,babies值是1、2、3,累积和为1、1+2=3、3+3=6,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

