Как назначить один счетчик группам смежных идентичных значений в R

#r #counting

#r #подсчет

Вопрос:

У меня есть столбец, содержащий двоичные значения, указывающие на наличие (1) или отсутствие (0) события. На основе этого столбца я хочу создать новый столбец, содержащий непрерывный счетчик, который присваивает один счетчик группам смежных событий.

 event <- c(0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0)

count<- c(0,0,0,1,0,0,0,2,2,2,2,2,0,0,0,0,0,0,3,3,0,0)

df <- data.frame(event, count)
 

Желаемый счетчик должен выглядеть следующим образом:

 event   count
0   0
0   0
0   0
1   1
0   0
0   0
0   0
1   2
1   2
1   2
1   2
1   2
0   0
0   0
0   0
0   0
0   0
0   0
1   3
1   3
0   0
0   0
 

Любые предложения, как туда добраться, очень ценятся. Спасибо!

Ответ №1:

С dplyr помощью следующего проверяет, есть ли 1 следующий a 0 и получает его совокупную сумму. Затем результат умножается на event так, чтобы сохранялись нули.

 library(dplyr)

df %>% 
  mutate(count_2 = event * cumsum(event == 1 amp; lag(event, default = 0) == 0))
 

дает

    event count count_2
1      0     0       0
2      0     0       0
3      0     0       0
4      1     1       1
5      0     0       0
6      0     0       0
7      0     0       0
8      1     2       2
9      1     2       2
10     1     2       2
11     1     2       2
12     1     2       2
13     0     0       0
14     0     0       0
15     0     0       0
16     0     0       0
17     0     0       0
18     0     0       0
19     1     3       3
20     1     3       3
21     0     0       0
22     0     0       0
 

Вариант base-R:

 df$count_2 <- df$event * cumsum(c(0, diff(df$event)==1))
 

Комментарии:

1. Спасибо! Я пытался сделать это с помощью mutate() ранее, но не удалось. Отличное решение!

Ответ №2:

Использование rle в базе R :

 df$count1 <- with(df, event * with(rle(event == 1),rep(cumsum(values), lengths)))
df

#   event count count1
#1      0     0      0
#2      0     0      0
#3      0     0      0
#4      1     1      1
#5      0     0      0
#6      0     0      0
#7      0     0      0
#8      1     2      2
#9      1     2      2
#10     1     2      2
#11     1     2      2
#12     1     2      2
#13     0     0      0
#14     0     0      0
#15     0     0      0
#16     0     0      0
#17     0     0      0
#18     0     0      0
#19     1     3      3
#20     1     3      3
#21     0     0      0
#22     0     0      0