R 计算某个值在列中出现的次数

R 计算某个值在列中出现的次数,r,dplyr,R,Dplyr,我的数据框中有一列,如下所示: > df # A tibble: 20 x 1 duration <dbl> 1 0 2 40.0 3 247. 4 11.8 5 116. 6 10.2 7 171. 8 7.58 9 87.8 10 23.2 11 390. 12 35.8 13 4.73 14 29.1 15 0

我的数据框中有一列,如下所示:

> df
# A tibble: 20 x 1
   duration
      <dbl>
 1     0   
 2    40.0 
 3   247.  
 4    11.8 
 5   116.  
 6    10.2 
 7   171.  
 8     7.58
 9    87.8 
10    23.2 
11   390.  
12    35.8 
13     4.73
14    29.1 
15     0   
16    36.8 
17    73.8 
18    12.9 
19   124.  
20    10.7
我需要对这些数据进行分组,以便从0开始到下一个0之前的最后一行的所有行都在一个组中。我使用for循环完成了这项工作:

counter <- 0

df$group <- NA
df$group[1] <- 1

for (i in 2:NROW(df)) {
  df$group[i] <-
    ifelse(df$duration[i] == 0, df$group[i - 1] + 1, df$group[i - 1])
}
这给了我想要的输出:

> df
# A tibble: 20 x 2
   duration group
      <dbl> <dbl>
 1     0        1
 2    40.0      1
 3   247.       1
 4    11.8      1
 5   116.       1
 6    10.2      1
 7   171.       1
 8     7.58     1
 9    87.8      1
10    23.2      1
11   390.       1
12    35.8      1
13     4.73     1
14    29.1      1
15     0        2
16    36.8      2
17    73.8      2
18    12.9      2
19   124.       2
20    10.7      2
但由于我最初的数据帧相当大,我正在寻找一个更快的解决方案,我一直试图让它与dplyr一起工作,但没有效果。其他相关的问题是计算当前值已经出现的频率,不是一个具体的问题,所以我还没有找到解决这个问题的方法

感谢您为我的问题找到矢量化解决方案,谢谢!以下是示例数据:

df <-
  structure(
    list(
      duration = c(
        0,
        40.0009999275208,
        247.248000144958,
        11.8349997997284,
        115.614000082016,
        10.2449998855591,
        171.426000118256,
        7.58200001716614,
        87.805999994278,
        23.1909999847412,
        390.417999982834,
        35.8229999542236,
        4.73100018501282,
        29.0869998931885,
        0,
        36.789999961853,
        73.8420000076294,
        12.8770000934601,
        123.771999835968,
        10.7190001010895
      )
    ),
    row.names = c(NA,-20L),
    class = c("tbl_df", "tbl", "data.frame")
  )

我们可以使用cumsum创建所需的列,如下所示


试试cumsumdf$duration==0谢谢,太简单了!你能把你的评论作为回答,让我接受吗?
df %>% 
  mutate(grp = cumsum(duration == 0))
# A tibble: 20 x 2
#   duration   grp
#      <dbl> <int>
# 1     0        1
# 2    40.0      1
# 3   247.       1
# 4    11.8      1
# 5   116.       1
# 6    10.2      1
# 7   171.       1
# 8     7.58     1
# 9    87.8      1
#10    23.2      1
#11   390.       1
#12    35.8      1
#13     4.73     1
#14    29.1      1
#15     0        2
#16    36.8      2
#17    73.8      2
#18    12.9      2
#19   124.       2
#20    10.7      2