添加一个计数列,如果满足特定条件,则计数两次

时间:2019-10-23 21:12:04

标签: r

我想知道是否有一种方法可以按组进行条件列计数,如果满足特定值(在这种情况下为0),则将row_number或rowid加1。例如:

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3,3,3,3), 
               condition=c(1,0,1,1,1,0,0,1,1,0,1,1,0, 1),
               want=c(1, 3, 4,5,1,3,5,6,7,2,3,4,6,7))
   group condition want
1      1         1    1
2      1         0    3
3      1         1    4
4      1         1    5
5      2         1    1
6      2         0    3
7      2         0    5
8      2         1    6
9      2         1    7
10     3         0    2
11     3         1    3
12     3         1    4
13     3         0    6
14     3         1    7

我认为这可能涉及为每个组创建一个row_number,然后创建一个自定义的row_number,但是我愿意提出建议。这是一种变通方法,可以在出现0时“分解”我的数据。

2 个答案:

答案 0 :(得分:2)

您可以这样做:

transform(df, want =  ave(condition, group, FUN = function(x) cumsum(x + (x == 0) * 2 )))

   group condition want
1      1         1    1
2      1         0    3
3      1         1    4
4      1         1    5
5      2         1    1
6      2         0    3
7      2         0    5
8      2         1    6
9      2         1    7
10     3         0    2
11     3         1    3
12     3         1    4
13     3         0    6
14     3         1    7

答案 1 :(得分:2)

使用dplyr,对于每组数据(group-by(group)),我们可以添加一列,该列的计数器为1至每个group的长度(即{ {1}})。通过添加n()的累积和,只要满足您的期望条件,该计数器就会再跳一个。

condition == 0

输出:

library(dplyr)

df1 %>% 
  group_by(group) %>% 
  mutate(desired = (1:n()) + cumsum(condition == 0))

数据:

#> # A tibble: 14 x 3
#> # Groups:   group [3]
#>    group condition desired
#>    <dbl>     <dbl>   <int>
#>  1     1         1       1
#>  2     1         0       3
#>  3     1         1       4
#>  4     1         1       5
#>  5     2         1       1
#>  6     2         0       3
#>  7     2         0       5
#>  8     2         1       6
#>  9     2         1       7
#> 10     3         0       2
#> 11     3         1       3
#> 12     3         1       4
#> 13     3         0       6
#> 14     3         1       7