使用r中其他两个列的group_by对行进行计数

时间:2019-01-10 23:00:47

标签: r group-by

我有如下数据。我想添加一个新列,该列在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    

2 个答案:

答案 0 :(得分:1)

我们可能将cumsumduplicated一起使用,

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