a data.table
approach
sample data
library( data.table )
DT <- fread("subject day1 day2 day3 day4 day5 day6 day7
A positive positive positive positive positive positive positive
B positive positive negative positive negative negative negative
C positive positive positive negative negative positive positive
D positive positive positive negative negative negative negative")
method 1. create marker column for pos-after-neg
#melt to long format
DT.long <- melt( DT, "subject" )
#get pos-after-neg by subject, create marker-column
DT.long[ DT.long[, .I[ value == "positive" & shift( value, fill = "positive", type = "lag" ) == "negative" ], by = subject ]$V1, marker := 1]
# subject variable value marker
# 1: A day1 positive NA
# 2: B day1 positive NA
# 3: C day1 positive NA
# 4: D day1 positive NA
# 5: A day2 positive NA
# 6: B day2 positive NA
# 7: C day2 positive NA
# 8: D day2 positive NA
# 9: A day3 positive NA
# 10: B day3 negative NA
# 11: C day3 positive NA
# 12: D day3 positive NA
# 13: A day4 positive NA
# 14: B day4 positive 1
# 15: C day4 negative NA
# 16: D day4 negative NA
# 17: A day5 positive NA
# 18: B day5 negative NA
# 19: C day5 negative NA
# 20: D day5 negative NA
# 21: A day6 positive NA
# 22: B day6 negative NA
# 23: C day6 positive 1
# 24: D day6 negative NA
# 25: A day7 positive NA
# 26: B day7 negative NA
# 27: C day7 positive NA
# 28: D day7 negative NA
# subject variable value marker
method 2. filter the relevant rows
#melt to long format
DT.long <- melt( DT, "subject" )
#get pos-after-neg by subject, create marker-column
DT.long[ DT.long[, .I[ value == "positive" & shift( value, fill = "positive", type = "lag" ) == "negative" ], by = subject ]$V1, ][]
# subject variable value
# 1: B day4 positive
# 2: C day6 positive