У меня есть данные формата
set.seed(40)
subject <- sample(c("mike", "john", "steve"), 20, replace = TRUE)
test1 <- sample(c("pos", "neg", "pos", "neg", "NA"), 20, replace = TRUE)
testdate <- Sys.Date() + sample(-1000:1000, 20, replace = FALSE)
mydf <- data.frame(subject, testdate, test1)
mydf$status <- "unknown"
Для каждого субъекта я хотел бы изменить значения статуса таким образом, чтобы: а) он оставался неизвестным до тех пор, пока не будет получен самый ранний (по дате тестирования) положительный или отрицательный результат для теста 1; b) когда получен первый результат pos test1, статус на эту дату и впоследствии становится «in» независимо от любых последующих значений test1; c) если отрицательный результат возникает для test1 до любого положительного результата, статус становится «вне» для этой и последующих дат до тех пор, пока не будет получен положительный результат test1. Открыт для всех решений. Я экспериментирую с dplyr и меня особенно заинтересует решение на основе dplyr.
Результат будет
subject testdate test1 status
john 2014-11-20 neg negative
john 2015-07-29 neg negative
john 2015-11-10 neg negative
john 2017-04-08 neg negative
john 2018-09-18 NA negative
mike 2014-09-01 pos positive
mike 2014-10-14 neg positive
mike 2015-03-22 neg positive
mike 2016-09-15 pos positive
mike 2017-08-18 neg positive
mike 2017-12-20 pos positive
mike 2018-09-06 NA positive
mike 2019-09-02 neg positive
steve 2015-06-21 neg negative
steve 2016-01-03 pos positive
steve 2016-03-12 neg positive
steve 2017-06-26 neg positive
steve 2017-12-02 neg positive
steve 2018-12-20 pos positive
steve 2019-06-20 pos positive