1) 顺序 使用末尾注释中的数据并假设您想在不更改行顺序的情况下执行此操作,此基本解决方案定义了排序 SUP 的排列作为o,将其应用于SUP,取其中的cumsum,然后通过应用逆序将其恢复为原始顺序,即order(o)。
o <- order(agfield$RAND)
transform(agfield, cum = cumsum(SUP[o])[order(o)])
给予:
ID SUP RAND csum
1 1 500 1 500
2 2 5681 4 12720
3 3 6514 3 7039
4 3 25 1 525
这是一个演示,表明逆序确实是上面显示的表达式。
set.seed(123)
x <- rnorm(1000)
o <- order(x)
identical(x, x[o][order(o)])
## [1] TRUE
如果对数据框进行排序是可以接受的,那么我们可以这样做,这会稍微短一些。
o <- order(agfield$RAND)
transform(agfield[o, ], cum = cumsum(SUP))
2) sql SQL 具有允许以不同于输入的顺序获取累积总和的特定功能,因此我们可以执行以下操作。请注意,除非我们明确要求,否则 SQL 不保证表的顺序,因此我们在末尾使用 order by rowid 以确保返回原始顺序 - 如果返回的顺序不重要,则可以省略它。
library(sqldf)
sqldf("select ID, SUP, RAND, sum(SUP) over (order by RAND, rowid) csum
from agfield
order by rowid")
给予:
ID SUP RAND csum
1 1 500 1 500
2 2 5681 4 12720
3 3 6514 3 7039
4 3 25 1 525
注意
Lines <- "
ID SUP RAND
1 500 1
2 5681 4
3 6514 3
3 25 1"
agfield <- read.table(text = Lines, header = TRUE)