Следующее, кажется, воспроизводит то, что вы хотите, без жесткого кодирования любых значений в логи c.
Примечание. Как отмечают другие, похоже, что существует несоответствие между результатами в вопросе и предоставленным кодом. Например, в посте с вопросом UniqueID GHI789 для месяца 3 имеет значение CountSkip 1, хотя код возвращает 0. Код в этом ответе возвращает 0.
data <- cbind.data.frame(UniqueID = c('ABC123','ABC123','ABC123','ABC123','ABC123','ABC123','DEF456','DEF456','DEF456','DEF456','DEF456','DEF456','GHI789','GHI789','JKL012','JKL012','JKL012'),
Month = c(1,2,3,4,6,7,3,4,10,11,12,14,2,3,12,13,14))
cartesian <- expand.grid(UniqueID = unique(as.character(data$UniqueID)),
Month = seq(from=min(data$Month), to=max(data$Month), by=1))
BA <- cartesian %>%
left_join(data %>% mutate(Month_orig=Month), by=c("UniqueID","Month")) %>%
arrange(UniqueID, Month) %>%
group_by(UniqueID) %>%
mutate(Skip = ifelse(Month==Month_orig &
is.na(lag(Month_orig,1)) &
Month!=min(Month[!is.na(Month_orig)]),
1, 0)) %>%
mutate(Skip = ifelse(Skip==1 & is.na(lag(Month_orig,2)), 0, Skip)) %>% # contstrain to only one skipped period?
filter(!is.na(Month_orig)) %>%
mutate(CountSkip = cumsum(Skip)) %>%
mutate(LastValue = ifelse(Month==max(Month), 1, 0)) %>%
mutate(FinalTally = ifelse(LastValue==1 & Month != max(Month),1,0)) %>%
mutate(SeqCount = FinalTally + CountSkip) %>%
select(-Month_orig)
BA
# A tibble: 17 x 7
# Groups: UniqueID [4]
UniqueID Month Skip CountSkip LastValue FinalTally SeqCount
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ABC123 1 0 0 0 0 0
2 ABC123 2 0 0 0 0 0
3 ABC123 3 0 0 0 0 0
4 ABC123 4 0 0 0 0 0
5 ABC123 6 1 1 0 0 1
6 ABC123 7 0 1 1 0 1
7 DEF456 3 0 0 0 0 0
8 DEF456 4 0 0 0 0 0
9 DEF456 10 0 0 0 0 0
10 DEF456 11 0 0 0 0 0
11 DEF456 12 0 0 0 0 0
12 DEF456 14 1 1 1 0 1
13 GHI789 2 0 0 0 0 0
14 GHI789 3 0 0 1 0 0
15 JKL012 12 0 0 0 0 0
16 JKL012 13 0 0 0 0 0
17 JKL012 14 0 0 1 0 0
При чтении вопроса и комментарии более внимательно - я согласен, что для реализации решения потребуется ссылка на предыдущую версию таблицы. Вы можете попробовать rbind (old_data, new_rows), где new_rows является результатом обработки всех данных и сохранения только уникального (UniqueID, Month), не содержащегося в old_data. Я не полностью следую логике или намерениям здесь, так что, возможно, это не очень хорошая идея.