我有如下数据。我想添加一个新列,该列在code
列更改时和ID
更改时计数,它会重置并计数器为1并开始计数。
ID code
1 10
1 10
1 11
1 11
1 21
1 21
2 10
2 10
2 11
2 11
2 11
2 14
2 15
resutl:
ID code counter
1 10 1
1 10 1
1 11 2
1 11 2
1 21 3
1 21 3
2 10 1
2 10 1
2 11 2
2 11 2
2 11 2
2 14 3
2 15 4
答案 0 :(得分:1)
我们可能将cumsum
与duplicated
一起使用,
df %>% group_by(ID) %>% mutate(counter = cumsum(!duplicated(code)))
# A tibble: 13 x 3
# Groups: ID [2]
# ID code counter
# <int> <int> <int>
# 1 1 10 1
# 2 1 10 1
# 3 1 11 2
# 4 1 11 2
# 5 1 21 3
# 6 1 21 3
# 7 2 10 1
# 8 2 10 1
# 9 2 11 2
# 10 2 11 2
# 11 2 11 2
# 12 2 14 3
# 13 2 15 4
如果code
从11恢复到10,则counter
不会增加。但我想这对您来说不可能,甚至可以达到预期的效果。
在这种情况下,duplicated
的工作方式如下:
cbind(df[df$ID == 1, "code"], !duplicated(df[df$ID == 1, "code"]))
# [,1] [,2]
# [1,] 10 1
# [2,] 10 0
# [3,] 11 1
# [4,] 11 0
# [5,] 21 1
# [6,] 21 0
只要出现code
中的新值,它就会给出一个值,然后cumsum
完成工作。
答案 1 :(得分:1)
您可以使用dplyr
进行此操作,使用lag
查找code
发生更改的行:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(counter = cumsum(c(1, tail(code != lag(code), -1))))
结果:
ID code counter
<int> <int> <dbl>
1 1 10 1
2 1 10 1
3 1 11 2
4 1 11 2
5 1 21 3
6 1 21 3
7 2 10 1
8 2 10 1
9 2 11 2
10 2 11 2
11 2 11 2
12 2 14 3
13 2 15 4