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

时间:2019-04-17 11:40:43

标签: r

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

我尝试过cumsum(negread_flag == 1),该值在0s之后继续求和

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

1 个答案:

答案 0 :(得分:1)

我们可以使用NULL(run-length-id-当相邻元素不同时生成不同的id)作为分组变量,然后获取组的序列并将其分配给“结果”,其中'negread_flag'为1,通过将'grp'列分配给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_number()的{​​{1}},通过将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 与“ negread_flag”相乘来创建“结果”,以便“ negread_flag”中与0对应的值变为0

base R

或使用i1 <- df1$negread_flag != 0 df1$result[i1] <- with(rle(df1$negread_flag), sequence(lengths * values))

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

或@markus评论

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")

数据

{{1}}