Мы могли бы использовать data.table
. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)
), сгруппированный по 'id', if
any
из 'event' равен 0 (!event
) для этого конкретного 'id', мы реплицируем 1 для длины этого group -1 (.N-1
) и объединить с 0 или else
, чтобы вернуть значение «событие», назначить (:=
) для обновления столбца «событие».
library(data.table)
setDT(df1)[, event :=if(any(!event)) c(rep(1L, .N-1),0L) else event, by = id]
df1
# id day event
# 1: 1 1 1
# 2: 1 3 1
# 3: 2 1 1
# 4: 2 4 1
# 5: 2 9 1
# 6: 2 15 0
# 7: 3 2 1
# 8: 3 5 0
# 9: 4 1 1
#10: 4 8 1
#11: 4 11 1
Или с помощью dplyr
мы группу по «идентификатору» и изменить столбец «событие», беря lead
логического вектора, который тиражируется и добавить с другим логическим вектором (all(event)
).
library(dplyr)
df1 %>%
group_by(id) %>%
mutate(event= lead(rep(any(!event), n()), default=0) + all(event))
# id day event
# (int) (int) (dbl)
#1 1 1 1
#2 1 3 1
#3 2 1 1
#4 2 4 1
#5 2 9 1
#6 2 15 0
#7 3 2 1
#8 3 5 0
#9 4 1 1
#10 4 8 1
#11 4 11 1
Я считаю, что это 'событие', что он имеет в виду –