我有一个这样的表:
| Group | Id | value |
| :---- | :- | :---- |
| A | a | 0 |
| A | b | 1 |
| A | c | 2 |
| A | d | 0 |
| A | e | 1 |
| B | f | 0 |
| B | g | 1 |
| B | h | 2 |
| B | i | 0 |
| B | j | 1 |
我想添加一个列,该列的值基于同一组下的前行和当前行之间的比较。 该列以值1开头,如果前一个值大于当前值,则该列将递增,并且这可能会在同一组中发生。
| Group | Id | value | iteration |
| :---- | :- | :---- | :-------- |
| A | a | 0 | 1 |
| A | b | 1 | 1 |
| A | c | 2 | 1 |
| A | d | 0 | 2 |
| A | e | 1 | 2 |
| B | f | 0 | 1 |
| B | g | 1 | 1 |
| B | h | 2 | 1 |
| B | i | 0 | 2 |
| B | j | 1 | 2 |
我尝试过:
df[ , iteration := if (value < shift(value)) shift(iteration) + 1 else shift(iteration), by = Group]
但是它返回错误:
if(value
1,并且只有第一个 元素将被使用” if(value
预先感谢
答案 0 :(得分:4)
一种dplyr
解决方案:
library(dplyr)
df <- data.frame(Group=rep(c("A","B"), each=5),
ID=letters[1:10], value=c(0,1,2,0,1,0,1,2,0,1))
df %>% group_by(Group) %>%
mutate(Iteration = cumsum(ifelse(value >= lag(value, default=Inf), 0, 1)))
编辑:以前我写了“ default = 1”,但是仅在每个组中的值都以0开头时才起作用。我用Inf替换了它,即使第一个值不为0也可以起作用。 EDIT2:现在,当后续两行中的值相同时,它可以正常工作。
答案 1 :(得分:1)
df%>%
group_by(Group)%>%
mutate(new = cumsum(c(1, diff(value)) < 0) + 1)
# A tibble: 10 x 4
# Groups: Group [2]
Group ID value new
<fct> <fct> <dbl> <dbl>
1 A a 0 1
2 A b 1 1
3 A c 2 1
4 A d 0 2
5 A e 1 2
6 B f 0 1
7 B g 1 1
8 B h 2 1
9 B i 0 2
10 B j 1 2