r以dplyr表示的每组总和

r以dplyr表示的每组总和,r,ggplot2,dplyr,R,Ggplot2,Dplyr,我开始喜欢dplyr,但我被一个用例卡住了。我希望能够将cumsum应用到包中的数据帧中的每个组中,但我似乎无法正确实现它 对于演示数据帧,我生成了以下数据: set.seed(123) len = 10 dates = as.Date('2014-01-01') + 1:len grp_a = data.frame(dates=dates, group='A', sales=rnorm(len)) grp_b = data.frame(dates=dates, group='B', sal

我开始喜欢
dplyr
,但我被一个用例卡住了。我希望能够将
cumsum
应用到包中的数据帧中的每个组中,但我似乎无法正确实现它

对于演示数据帧,我生成了以下数据:

set.seed(123)

len = 10 
dates = as.Date('2014-01-01') + 1:len
grp_a = data.frame(dates=dates, group='A', sales=rnorm(len))
grp_b = data.frame(dates=dates, group='B', sales=rnorm(len))
grp_c = data.frame(dates=dates, group='C', sales=rnorm(len))
df = rbind(grp_a, grp_b, grp_c)
这将创建一个数据帧,看起来像:

        dates group       sales
1  2014-01-02     A -0.56047565
2  2014-01-03     A -0.23017749
3  2014-01-04     A  1.55870831
4  2014-01-05     A  0.07050839
5  2014-01-06     A  0.12928774
6  2014-01-02     B  1.71506499
7  2014-01-03     B  0.46091621
8  2014-01-04     B -1.26506123
9  2014-01-05     B -0.68685285
10 2014-01-06     B -0.44566197
11 2014-01-02     C  1.22408180
12 2014-01-03     C  0.35981383
13 2014-01-04     C  0.40077145
14 2014-01-05     C  0.11068272
15 2014-01-06     C -0.55584113
然后,我继续创建一个用于绘图的数据帧,但是使用了一个for循环,我想用更干净的东西来替换它

pdf = data.frame(dates=as.Date(as.character()), group=as.character(), sales=as.numeric())
for(grp in unique(df$group)){
  subs = filter(df, group == grp) %>% arrange(dates)
  pdf = rbind(pdf, data.frame(dates=subs$dates, group=grp, sales=cumsum(subs$sales)))
}
我使用此
pdf
创建一个绘图

p = ggplot() 
p = p + geom_line(data=pdf, aes(dates, sales, colour=group))
p + ggtitle("sales per group")


是否有更好的方法(使用dplyr方法)来创建此数据帧?我已经研究了
summary
方法,但这似乎是从N个项目->1个项目聚合一个组。这个用例目前似乎破坏了我的dplyr流程。有没有更好的建议

啊。我四处摆弄之后,似乎找到了它

pdf = df %>% group_by(group) %>% arrange(dates) %>% mutate(cs = cumsum(sales))
有问题的forloop的输出: 此代码行的输出: 试用

 group_by(group) %>%
 arrange(group) %>% 
 summarise(cs = sum(sales)) %>%
 mutate(sales_grp = cumsum(cs))
我知道这个Q/A有点过时,但这可能会帮助那些在阅读了dplyr发布的cumsum()解决方案后陷入困境的人 在及

以上链接中发布的解决方案不按组汇总。代码只按顺序添加下一行,这不是分组的累积和。我认为OP是在寻找A组、B组和C组的销售额之和,每个组的总销售额加上下一组——在OPs案例中,您的总销售额n()应该是3,而不是15,加上一个分组的总和()。例如,如果您试图计算10月底之前的年销售额的百分比,那么这将很有帮助,这样您就需要每月的销售额总和,然后是全年的总销售额


因此,您需要首先按每个组汇总值,然后按组的顺序进行汇总。PS——这是我第一次尝试回答关于SO的问题,并发布一个对我有用的解决方案;所以,如果我的回答是错的,我希望你能善待我。我总是试图从我的错误中吸取教训。

你是在追求这个:
df%>%groupby(group)%%>%mutate(累计销售额=累计销售额(销售))
?就在我写下我自己的答案时,我看到了你的评论。你是对的。如果你想提交答案,我很乐意给你分数。没有必要-你应该接受你自己的答案。:)您可能需要将
%%>%arrange(dates)
添加到一行程序中,以防数据集不会像在
for
循环中那样进行排序
> pdf = df %>% group_by(group) %>% mutate(cs = cumsum(sales))
> pdf
Source: local data frame [15 x 4]
Groups: group

        dates group       sales         cs
1  2014-01-02     A -0.56047565 -0.5604756
2  2014-01-03     A -0.23017749 -0.7906531
3  2014-01-04     A  1.55870831  0.7680552
4  2014-01-05     A  0.07050839  0.8385636
5  2014-01-06     A  0.12928774  0.9678513
6  2014-01-02     B  1.71506499  1.7150650
7  2014-01-03     B  0.46091621  2.1759812
8  2014-01-04     B -1.26506123  0.9109200
9  2014-01-05     B -0.68685285  0.2240671
10 2014-01-06     B -0.44566197 -0.2215949
11 2014-01-02     C  1.22408180  1.2240818
12 2014-01-03     C  0.35981383  1.5838956
13 2014-01-04     C  0.40077145  1.9846671
14 2014-01-05     C  0.11068272  2.0953498
15 2014-01-06     C -0.55584113  1.5395087
 group_by(group) %>%
 arrange(group) %>% 
 summarise(cs = sum(sales)) %>%
 mutate(sales_grp = cumsum(cs))