如何按行计算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方法处理后,输出就是你期望的:
| a | b | c |
|---|---|---|
| 1 | 3 | 6 |
| 2 | 5 | 9 |
| 3 | 3 | 8 |
| 4 | 9 | 15 |
| 5 | 5 | 12 |
| 6 | 13 | 21 |
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

