【发布时间】:2016-01-04 19:01:54
【问题描述】:
我在 data.frame 中有一个数字向量,如下所示。
df <- data.frame(a = c(1,2,3,4,2,3,4,5,8,9,10,1,2,1))
我需要创建一个新列,该列提供大于其前身的条目的运行计数。结果列向量应该是这样的:
0,1,2,3,0,1,2,3,4,5,6,0,1,0
我的尝试是创建一个“标志”列的差异来标记值何时更大。
df$flag <- c(0,diff(df$a)>0)
> df$flag
[1] 0 1 1 1 0 1 1 1 1 1 1 0 1 0
然后我可以应用一些 dplyr group/sum 魔法来几乎得到正确的答案,除了当 flag == 0 时总和不会重置:
df %>% group_by(flag) %>% mutate(run=cumsum(flag))
a flag run
1 1 0 0
2 2 1 1
3 3 1 2
4 4 1 3
5 2 0 0
6 3 1 4
7 4 1 5
8 5 1 6
9 8 1 7
10 9 1 8
11 10 1 9
12 1 0 0
13 2 1 10
14 1 0 0
我不想求助于 for() 循环,因为我有几个这样的运行总和要计算 data.frame 中的数十万行。
【问题讨论】:
标签: r dplyr cumulative-sum