多个累积总和

时间:2016-02-11 12:42:59

标签: sql r sqldf

希望标题足够明确。

我的桌子看起来像这样:

classes id value
a       1  10
a       2  15
a       3  12
b       1  5
b       2  9
b       3  7
c       1  6
c       2  14
c       3  6

这就是我想要的:

classes id value cumsum
a       1  10    10
a       2  15    25
a       3  12    37
b       1  5     5
b       2  9     14
b       3  7     21
c       1  6     6
c       2  14    20
c       3  6     26

我见过this solution,我已经成功应用于我没有多个班级的情况:

id value cumsum
1  10    10
2  15    25
3  12    37

它的速度相当快,即使数据集的大小相当于我目前正在处理的数据集。

但是,当我尝试将完全相同的代码应用于我现在正在处理的数据集时(看起来像这个问题的第一个表,IE多个类),而没有按a对其进行子集化,{ {1}},b,在我看来,这需要很长时间(现在已经运行了4个小时。数据集为40.000行)。

在此上下文中使用时,是否知道linked answer中的代码是否存在问题?我无法将头部绕在三角形连接处,但我觉得当行数增加时size the join takes可能存在问题,从而使整个事情变得更加缓慢,甚至可能因为事实上,有多个“类”可用于累积总和。

有没有办法可以更快地完成这项工作?我通过c包在SQL中使用R。 R代码(带或不带外部公共包)或SQL代码的解决方案都可以。

由于

2 个答案:

答案 0 :(得分:3)

在SQL中,您可以使用ANSI标准sum() over ()功能执行累积求和:

select classes, id, value,
       sum(value) over (partition by classes order by id) as cumesum
from t;

答案 1 :(得分:3)

或者您可以使用by包中的base

df$cumsum <- unlist(by(df$value, df$classes, cumsum))
#  classes id value cumsum
#1       a  1    10     10
#2       a  2    15     25
#3       a  3    12     37
#4       b  1     5      5
#5       b  2     9     14
#6       b  3     7     21
#7       c  1     6      6
#8       c  2    14     20
#9       c  3     6     26