#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