希望标题足够明确。
我的桌子看起来像这样:
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代码的解决方案都可以。
由于
答案 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