Мы могли бы group_by
UI
и взять совокупную сумму вхождения MV == 1
library(dplyr)
df %>%
group_by(UI) %>%
mutate(NV = cumsum(MV == 1))
# UI TV MV NV
# <int> <int> <int> <int>
# 1 1 1 0 0
# 2 1 2 1 1
# 3 1 3 0 1
# 4 2 1 0 0
# 5 2 2 0 0
# 6 2 3 1 1
# 7 2 4 2 1
# 8 3 1 1 1
# 9 3 2 0 1
#10 3 3 1 2
#11 3 4 1 3
В базе R мы можем использовать ave
with(df, ave(MV == 1, UI, FUN = cumsum))
#[1] 0 1 1 0 0 1 1 1 1 2 3
данные
df <- structure(list(UI = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L,
3L), TV = c(1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), MV = c(0L,
1L, 0L, 0L, 0L, 1L, 2L, 1L, 0L, 1L, 1L)), class = "data.frame",
row.names = c(NA,
-11L))