如何按col2分组,以初始值40为起点逐行减col1前值生成rem_val列
解决方案
你可以用两种常见方式实现需求,分别基于dplyr+purrr的函数式方法,以及Base R的循环方法,以下是具体代码:
方法一:使用dplyr + purrr(推荐,代码更简洁)
先加载所需包,再按col2分组计算rem_val:
library(dplyr) library(purrr) df <- data.frame(col1 = c(2,3,6,1,8,4,8,2,4,5,7,4,2,7),col2 = c(rep(1,4),rep(2,3),rep(3,4),rep(4,3))) df_processed <- df %>% group_by(col2) %>% mutate( # 每个分组先构造初始值40,再拼接除最后一个元素外的col1 # accumulate函数按顺序执行"上一个结果 - 当前col1值"的计算 rem_val = accumulate(c(40, col1[-n()]), ~ .x - .y) ) %>% ungroup() print(df_processed)
方法二:使用Base R的ave函数(无需额外加载包)
通过自定义函数在每个分组内循环计算:
df <- data.frame(col1 = c(2,3,6,1,8,4,8,2,4,5,7,4,2,7),col2 = c(rep(1,4),rep(2,3),rep(3,4),rep(4,3))) df$rem_val <- ave(df$col1, df$col2, FUN = function(x) { res <- numeric(length(x)) res[1] <- 40 # 每个分组初始值设为40 # 从第2行开始,依次用上一行的rem_val减去上一行的col1 for(i in 2:length(x)) { res[i] <- res[i-1] - x[i-1] } res }) print(df)
结果说明
两种方法都会得到符合要求的rem_val列:
- 每个
col2分组的第一行rem_val为40 - 后续每行的
rem_val= 上一行rem_val- 上一行col1的值
内容的提问来源于stack exchange,提问作者cd21
相关产品推荐
相关产品推荐

