R语言 添加一个count列,如果满足某个条件,则计数两次

ffx8fchx  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(137)

我想知道是否有一种方法可以按组进行条件列计数,如果满足某个值(在本例中为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时“分解”数据的变通方法。

wgeznvg7

wgeznvg71#

使用dplyr,对于每组数据(group-by(group)),我们可以添加一个列,该列具有从1到每个group长度的计数器(即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

* 数据:*

df1 <- 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))
m0rkklqb

m0rkklqb2#

您可以:

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

相关问题