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
相关产品推荐
相关产品推荐

