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

R语言如何实现数据框按行负向累计求和得到目标结果

R语言数据框按行计算负向累计求和实现方法

你的需求本质是对每行的Freq列,依次减去后面Year.xxxx列的累计和,得到对应位置的新列值,以下是两种常用可直接运行的实现方案:

方案1:基础R实现

# 构造测试数据
data <- data.frame(
  `Delivery Year` = c('1976','1977','1978','1979'),
  `Freq` = c(120,100,80,60),
  `Year.1976` = c(10,3,8,0),
  `Year.1977` = c(5,0,5,0),
  `Year.1978` = c(10,10,0,0),
  `Year.1979` = c(13,0,0,14),
  check.names = FALSE
)

# 提取所有Year开头的待计算列
year_cols <- data[, grep("^Year\\.", colnames(data))]
# 按行计算累计和后,用Freq减去累计值得到目标列
calc_cols <- data$Freq - t(apply(year_cols, 1, cumsum))
# 合并前两列和计算结果,修改列名匹配期望输出
data_res <- cbind(data[,1:2], calc_cols)
colnames(data_res) <- c("Delivery Year", "Freq", paste0("Year.", 1:4))

# 输出结果
data_res

方案2:tidyverse风格实现

library(dplyr)
library(tidyr)

data_res <- data %>%
  rowwise() %>%
  # 按行计算累计减法结果
  mutate(res = list(Freq - cumsum(c_across(starts_with("Year."))))) %>%
  # 拆分结果为单独列
  unnest_wider(res, names_sep = ".") %>%
  # 重命名列并保留目标字段
  select(`Delivery Year`, Freq, starts_with("res.")) %>%
  rename_with(~paste0("Year.", seq_along(.)), starts_with("res."))

两种方案运行后得到的结果均和你给出的期望输出完全一致。

内容的提问来源于stack exchange,提问作者Jaroslav Kotrba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:36:00