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

如何在R中按特定连续方式对行值求和并生成新数据框

解决方案

针对你需要的连续累加求和并生成新数据框的需求,以下是几种简洁高效的实现方式,适合处理大型数据集:

先构造示例数据

先创建一个和你描述结构一致的示例数据框,方便测试:

# 示例数据框
df <- data.frame(
  row_id = paste0("r", 1:5),
  f = letters[1:5],
  avg = c(10, 20, 30, 40, 50),
  set = rep("A", 5),
  other = rnorm(5)
)

1. 基础R实现(无需额外包)

利用cumsum()直接计算累加和,避免手动循环,效率高:

# 计算从r1到当前行的avg累加和,去掉仅r1的结果
cumulative_sums <- cumsum(df$avg)[-1]

# 生成对应的行标识(如r1_2、r1_2_3)
row_labels <- sapply(2:nrow(df), function(x) paste0("r1_", paste(2:x, collapse = "_")))

# 构造新数据框,按需保留其他列
new_df <- data.frame(
  row_id = row_labels,
  sum_avg = cumulative_sums,
  set = df$set[1], # 假设set列是统一分组值,按需调整
  stringsAsFactors = FALSE
)

2. tidyverse(dplyr)实现

适合习惯管道式编程的用户,代码更易读:

library(dplyr)

new_df_tidy <- df %>%
  # 计算累加和
  mutate(sum_avg = cumsum(avg)) %>%
  # 移除仅r1的累加行
  slice(-1) %>%
  # 生成行标识
  mutate(row_id = sapply(row_number(), function(x) paste0("r1_", paste(2:x, collapse = "_")))) %>%
  # 选择需要保留的列
  select(row_id, sum_avg, set)

3. data.table实现(大型数据集首选)

data.table的操作速度远快于基础R和dplyr,处理百万级以上行数据时优势明显:

library(data.table)

dt <- as.data.table(df)
new_dt <- dt[, sum_avg := cumsum(avg)][-1]
# 生成行标识,.I代表当前行在原表中的索引
new_dt[, row_id := sapply(.I, function(x) paste0("r1_", paste(2:(x+1), collapse = "_")))]
# 选择需要的列
new_dt <- new_dt[, .(row_id, sum_avg, set)]

关键说明

  • cumsum()是核心函数,它能快速生成累计和向量,完全替代手动循环,避免出错且效率极高。
  • 行标识的生成通过sapply()遍历行号,动态拼接字符串,无需手动逐个编写。
  • 如果other等列需要保留或做其他汇总,只需调整select()或添加对应mutate()逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:30:24