在dplyr中"转发"累积金额

Mic*_*ill 5 r dplyr

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

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

即,此时有多少参与者完成了一定数量的评估.

虽然知道有多少人完成了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
Run Code Online (Sandbox Code Playgroud)

生成累积总和很简单:

mutate(df, cumsum = cumsum(n_people))
Run Code Online (Sandbox Code Playgroud)

什么是生成可以纳入dplyr分析链的"转发累积金额"的表达式?我猜这cumsum需要n_people在通过n_sessions降序排序之后应用,但是在保留数据帧的原始顺序的同时不能完全理解如何得到答案.

Dav*_*son 10

您可以获取反向矢量的累积和,然后反转该结果.内置的rev功能在这里很有用:

mutate(df, rev_cumsum = rev(cumsum(rev(n_people))))
Run Code Online (Sandbox Code Playgroud)

例如,在您的数据上,它返回:

  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
Run Code Online (Sandbox Code Playgroud)

  • 尴尬地简单!非常感谢您提供如此迅速的答案,我仍然需要等待10分钟才能接受它。干杯。 (2认同)