Вот вариант base R
transform(DF, spell = ave(
employment,
id,
FUN = function(x)
ifelse(all(x == 0), 0, which(cumsum(x) == 1))
))
# year id employment spell
#1 1998 1 0 0
#2 2000 1 0 0
#3 2002 1 0 0
#4 2004 1 0 0
#5 1998 2 0 3
#6 2000 2 0 3
#7 2002 2 1 3
#8 2004 2 1 3
#9 1998 3 0 2
#10 2000 3 1 2
#11 2002 3 1 2
#12 2004 3 1 2
Основная идея состоит в том, чтобы искать позицию первой 1
- which(cumsum(x) == 1)
- на группу id
. Но поскольку в группе, где id == 1
, нет ни одного, нам нужно ifelse
для обработки этого случая.
Данные
DF <- structure(list(year = c(1998L, 2000L, 2002L, 2004L, 1998L, 2000L,
2002L, 2004L, 1998L, 2000L, 2002L, 2004L), id = c(1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), employment = c(0L, 0L, 0L,
0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L)), .Names = c("year", "id",
"employment"), class = "data.frame", row.names = c(NA, -12L))