在dplyr中实现“向前”累加和

11

在检查长期研究的数据集时,我通常会从原始数据中得到像这样的dplyr分析链的结果:

df = data.frame(n_sessions=c(1,2,3,4,5), n_people=c(59,89,30,23,4))

即在此时完成了特定数量的评估的参与者人数统计。

虽然知道恰好完成n个会话的人数很有用,但我们更需要知道完成了至少n个会话的人数。根据下表,标准的累积和不适合于此,我们需要的是“n_total”列中的值,这是“n_people”列的一种“向前累加和”。即每行的值应该是它自己和所有超过它的值的总和,而不是标准的累积和,即它本身及其之前所有值的总和:

n_sessions n_people  n_total  cumsum
         1       59      205      59
         2       89      146     148
         3       30       57     178
         4       23       27     201
         5        4        4     205

生成累加和很简单:

mutate(df, cumsum = cumsum(n_people))

如何在dplyr分析链中添加生成“向前累积总和”的表达式?我猜想需要对n_people按照n_sessions降序排序后应用cumsum函数,但是不确定如何在保留数据框原始顺序的同时得出答案。

1个回答

18
你可以对反转后的向量进行累加,然后再反转结果。内置的 "rev" 函数在这里很有帮助: rev
mutate(df, rev_cumsum = rev(cumsum(rev(n_people))))

例如,对于您的数据,这将返回:
  n_sessions n_people rev_cumsum
1          1       59        205
2          2       89        146
3          3       30         57
4          4       23         27
5          5        4          4

4
非常简单!非常感谢您如此迅速地回答问题,以至于我仍需要等待10分钟才能接受它。干杯。 - Michael MacAskill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接