Один способ решить эту проблему, используя for
loop
#Initialize the identifier and result
df$result <- 0
identifier <- 0
#For every row in df
for (i in seq_len(nrow(df))) {
#Check if the shift occurs (NA in current memberidprev)
if (is.na(df$memberidprev[i])) {
#Create a new identifier
identifier = identifier + 1
df$result[i] <- identifier
}
else {
#If there is no shift get result from previous Year and memberid
df$result[i] <- df$result[df$memberid == df$memberidprev[i] &
(df$Year[i] - 1) == df$Year]
}
}
df
# familyid memberid memberidprev panelid Year result
#1 100 1 NA 1 2010 1
#2 100 2 NA 1 2010 2
#3 100 2 1 2 2011 1
#4 100 1 2 2 2011 2
#5 100 2 2 3 2012 1
#6 100 1 1 3 2012 2
#7 100 2 2 4 2013 1
#8 100 1 1 4 2013 2
#9 100 1 1 5 2014 2
#10 100 2 NA 5 2014 3
#11 100 3 NA 5 2014 4
#12 100 1 2 6 2015 3
#13 100 2 3 6 2015 4
#14 100 3 1 6 2015 2
Данные
df <- structure(list(familyid = c(100L, 100L, 100L, 100L, 100L, 100L,
100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L), memberid = c(1L,
2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 3L, 1L, 2L, 3L), memberidprev = c(NA,
NA, 1L, 2L, 2L, 1L, 2L, 1L, 1L, NA, NA, 2L, 3L, 1L), panelid = c(1L,
1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L), Year = c(2010L,
2010L, 2011L, 2011L, 2012L, 2012L, 2013L, 2013L, 2014L, 2014L,
2014L, 2015L, 2015L, 2015L)), row.names = c(NA, -14L), class = "data.frame")