Мы группируем по 'ID', получаем кумулятивную сумму логического вектора, созданного с помощью str_detect
, и переносим кумулятивную сумму, чтобы сложить 1 значения
library(tidyverse)
D1 %>%
group_by(ID) %>%
mutate(deep = cumsum(cumsum(str_detect(case, "[Uu]p") & !is.na(case))))
# A tibble: 18 x 3
# Groups: ID [6]
# ID case deep
# <chr> <chr> <int>
# 1 aa <NA> 0
# 2 aa <NA> 0
# 3 aa Up 1
# 4 aa <NA> 2
# 5 cc <NA> 0
# 6 cc <NA> 0
# 7 dd <NA> 0
# 8 dd <NA> 0
# 9 dd Up 1
#10 dd <NA> 2
#11 dd <NA> 3
#12 dd <NA> 4
#13 ee <NA> 0
#14 ee <NA> 0
#15 ee <NA> 0
#16 ff up 1
#17 ff <NA> 2
#18 gg <NA> 0
данные
D1 <- structure(list(ID = c("aa", "aa", "aa", "aa", "cc", "cc", "dd",
"dd", "dd", "dd", "dd", "dd", "ee", "ee", "ee", "ff", "ff", "gg"
), case = c(NA, NA, "Up", NA, NA, NA, NA, NA, "Up", NA, NA, NA,
NA, NA, NA, "up", NA, NA)), class = "data.frame", row.names = c(NA,
-18L))