You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:55:29