在R中的条件下重新开始计数

在R中的条件下重新开始计数,r,R,我有一个包含连续流1和0的标志列。我想添加1的流。当遇到0时,求和应该停止。对于下一个1流,求和应该重新开始 我尝试过cumsum(Negrad_flag==1),它在0之后继续求和 negread_flag result 1 1 1 2 1 3 1 4 0 0 0 0 0 0 1

我有一个包含连续流1和0的标志列。我想添加1的流。当遇到0时,求和应该停止。对于下一个1流,求和应该重新开始

我尝试过cumsum(Negrad_flag==1),它在0之后继续求和

negread_flag   result
1               1
1               2 
1               3  
1               4 
0               0 
0               0
0               0
1               1
1               2
1               3
0               0

我们可以使用
rleid
(运行长度id-在相邻元素不同时生成不同的id)作为分组变量,然后获取组的序列并将其分配给'result',其中'negread_flag'为1,通过将其分配给
NULL

library(data.table)
setDT(df1)[, grp := rleid(negread_flag)
     ][, result := 0
     ][negread_flag == 1, 
      result := seq_len(.N), grp][, grp := NULL][]
#     negread_flag result
# 1:            1      1
# 2:            1      2
# 3:            1      3
# 4:            1      4
# 5:            0      0
# 6:            0      0
# 7:            0      0
# 8:            1      1
# 9:            1      2
#10:            1      3
#11:            0      0

或者类似于
tidyverse
,使用
rleid
(来自
data.table
),通过将
row\u number()
与“negread\u标志”相乘来创建“result”,使“negread\u标志”中对应于0的值变为0

library(tidyverse)
df1 %>%
   group_by(grp = rleid(negread_flag)) %>%
   mutate(result = row_number() * negread_flag) %>% 
   ungroup %>% 
   select(-grp)
# A tibble: 11 x 2
#   negread_flag result
#          <int>  <int>
# 1            1      1
# 2            1      2
# 3            1      3
# 4            1      4
# 5            0      0
# 6            0      0
# 7            0      0
# 8            1      1
# 9            1      2
#10            1      3
#11            0      0
或者像@markus评论的那样

df1$result[i1] <- sequence(rle(df1$negread_flag)$lengths) * df1$negread_flag

df1$result[i1]@Henrik复制链接没有给我预期的输出
with(df1,(!negread_flag)*unlist(lapply(rle(negread_flag)$length,seq_len))。[1]0 0 0 0 0 1 2 3 0 0 1
df1$result[i1] <- sequence(rle(df1$negread_flag)$lengths) * df1$negread_flag
df1 <- structure(list(negread_flag = c(1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 
  1L, 1L, 0L)), row.names = c(NA, -11L), class = "data.frame")