作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
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
最佳答案
这是 ave
的一种方式:
ave(df$a, cumsum(c(F, diff(df$a) < 0)), FUN=seq_along) - 1
[1] 0 1 2 3 0 1 2 3 4 5 6 0 1 0
diff(df$a) < 0
分组的运行计数.哪些是向量中小于其前辈的位置。我们添加
c(F, ..)
占第一位。该向量的累积总和创建了一个用于分组的索引。函数
ave
可以对该索引执行函数,我们使用
seq_along
进行计数。但由于它从 1 开始,我们减一
ave(...) - 1
从零开始。
dplyr
的类似方法:
library(dplyr)
df %>%
group_by(cumsum(c(FALSE, diff(a) < 0))) %>%
mutate(row_number() - 1)
关于R按条件累计总和并重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994060/
我是一名优秀的程序员,十分优秀!