首页 > 解决方案 > 使用 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         

结果:

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    

标签: rgroup-by

解决方案


我们可以使用cumsumwith duplicatedas in

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完成工作。


推荐阅读