从头到尾计算cumsum [英] Calculate cumsum from the end towards the beginning
本文介绍了从头到尾计算cumsum的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试计算每个组从最后一行到第一行的 cumsum
.
示例数据:
t1 <- data.frame(var = "a", val = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0,0))t2 <- data.frame(var = "b", val = c(0,0,0,0,1,0,0,1,0,0,0,0,0,0,0))ts <- rbind(t1, t2)
所需格式(按var
分组):
ts <- data.frame(var = c("a", "a", "a", "a", "a", "a", "a", "a","a", "a", "a", "a", "a", "a", "a","b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"", "b", "b"),val = c(2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0))
解决方案
将我的评论提升为答案;使用:
ts$val2 <- ave(ts$val, ts$var, FUN = function(x) rev(cumsum(rev(x))))
给出:
<块引用><代码>>tsvar val val21 0 22 0 23 0 24 0 25 1 26 0 17 一个 0 18 一个 0 19 一个 0 110 1 111 0 012 一个 0 013 一个 0 014 一个 0 015 0 016 乙 0 217 乙 0 218 乙 0 219 乙 0 220 1 221 乙 0 122 乙 0 123 乙 1 124 b 0 025 b 0 026 乙 0 027 乙 0 028 b 0 029 乙 0 030 乙 0 0
或使用 dplyr
或 data.table
:
库(dplyr)%>%group_by(var) %>%变异(val2 = rev(cumsum(rev(val))))图书馆(数据表)setDT(ts)[, val2 := rev(cumsum(rev(val))), by = var]
I'm trying to calculate the cumsum
starting from the last row towards the first for each group.
Sample data:
t1 <- data.frame(var = "a", val = c(0,0,0,0,1,0,0,0,0,1,0,0,0,0,0))
t2 <- data.frame(var = "b", val = c(0,0,0,0,1,0,0,1,0,0,0,0,0,0,0))
ts <- rbind(t1, t2)
Desired format (grouped by var
):
ts <- data.frame(var = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"),
val = c(2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0))
解决方案
Promoting my comment to an answer; using:
ts$val2 <- ave(ts$val, ts$var, FUN = function(x) rev(cumsum(rev(x))))
gives:
> ts var val val2 1 a 0 2 2 a 0 2 3 a 0 2 4 a 0 2 5 a 1 2 6 a 0 1 7 a 0 1 8 a 0 1 9 a 0 1 10 a 1 1 11 a 0 0 12 a 0 0 13 a 0 0 14 a 0 0 15 a 0 0 16 b 0 2 17 b 0 2 18 b 0 2 19 b 0 2 20 b 1 2 21 b 0 1 22 b 0 1 23 b 1 1 24 b 0 0 25 b 0 0 26 b 0 0 27 b 0 0 28 b 0 0 29 b 0 0 30 b 0 0
Or with dplyr
or data.table
:
library(dplyr)
ts %>%
group_by(var) %>%
mutate(val2 = rev(cumsum(rev(val))))
library(data.table)
setDT(ts)[, val2 := rev(cumsum(rev(val))), by = var]
这篇关于从头到尾计算cumsum的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文