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

如何按行计算DataFrame的累积和?需求与代码尝试

解决按行累积求和的问题

看你的需求是对DataFrame的每一行做累积求和——也就是从第二列开始,每一列的值等于它本身加上前一列的值,最终得到你期望的输出。先说说你现有代码的问题,再给你几种高效的解法。

你的代码存在的问题

你的双重循环有两个关键错误:

  • 外层循环for (i in nrow(AD)):nrow(AD)返回的是行数的单个数值(比如你的示例里是6),这意味着循环只会执行最后一行,而不是遍历所有行。应该改成for (i in 1:nrow(AD))
  • 内层循环for (j in ncol(AD)):同样,ncol(AD)返回的是列数的单个数值(示例里是3),而且如果j从1开始的话,j-1会变成0,导致索引错误。正确的应该是从第2列开始遍历,也就是for (j in 2:ncol(AD))

另外,直接在原DataFrame上修改虽然能行,但R里有更简洁高效的内置函数,不需要手动写循环。

修正后的循环代码

如果一定要用循环,修正后的代码是这样的:

# 假设AD是你的DataFrame
for (i in 1:nrow(AD)) {
  for (j in 2:ncol(AD)) {
    AD[i, j] <- AD[i, j] + AD[i, j-1]
  }
}

把这段代码跑一遍,就能得到你期望的输出。

更高效的向量化解法(推荐)

R是向量型语言,用内置函数比手动循环更快,尤其是数据量较大的时候(比如你的50行12列),推荐下面几种方法:

方法1:用apply + cumsum

cumsum本身就是累积求和函数,结合apply按行处理:

AD <- t(apply(AD, 1, cumsum))
# 注意:apply返回的是矩阵,转置后转成DataFrame(如果需要的话)
AD <- as.data.frame(AD)

这段代码的逻辑是:对每一行(MARGIN=1)应用cumsum函数,然后转置结果(因为apply返回的矩阵是按列排列的),最后转成DataFrame。

方法2:用dplyr包(适合tidyverse用户)

如果你习惯用tidyverse工具链,可以用rowwise配合c_across:

library(dplyr)

AD <- AD %>%
  rowwise() %>%
  mutate(across(everything(), ~cumsum(.x))) %>%
  ungroup()

这段代码会按行分组,对每一列计算累积求和,最后取消分组。

方法3:用data.table包(大数据量最优)

如果你的数据量很大,data.table的速度会更快:

library(data.table)

setDT(AD)
AD[, (colnames(AD)) := lapply(.SD, cumsum), by = 1:nrow(AD)]

这里按每行分组,对所有列(.SD)应用cumsum函数。

验证示例

用你给出的示例输入测试:
输入DataFrame:

AD <- data.frame(
  a = 1:6,
  b = c(1,3,0,5,0,7),
  c = c(3,4,5,6,7,8)
)

用apply方法处理后,输出就是你期望的:

abc
136
259
338
4915
5512
61321

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:44:24