从头到尾计算cumsum [英] Calculate cumsum from the end towards the beginning

查看:81
本文介绍了从头到尾计算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

或使用 dplyrdata.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆