Я искал ответ на этот вопрос, но не смог найти ответ, который помог бы мне со столбцом с числами и строками. Мои данные выглядят так
Name <- c("Doe, John","Doe, John","Doe, John", "Doe, Jane", "Doe, Jane","Doe, Jane","Parker, Peter","Parker, Peter","Parker, Peter", "Stark, Tony","Stark, Tony","Stark, Tony")
Accession <- c(123, 234, 345, 456, 567, 678, 789, 8910, 1023, 1134, 1567, 1769)
MRN <-c(55555, 55555, 55555, 66666, 66666, 66666, 77777, 77777, 77777, 88888, 88888, 88888)
Collected <-c("2022-01-05", "2022-01-06", "2022-01-07", "2022-01-08", "2022-01-09", "2022-01-10", "2022-01-11", "2022-01-12", "2022-01-13", "2022-01-14", "2022-01-15", "2022-01-16")
Result <-c(137, "Not Detected", 356, 1025, 1405, 538, "Not Detected", "Not Detected", "Not Detected", "Not Detected", 137, "Not Detected")
CV <- data.frame(Name, Accession, MRN, Collected, Result)
У меня есть несколько наблюдений за группой людей (иногда до 100 на человека) Я хотел бы начать отсчет с их первого наблюдения на основе даты, когда у них есть положительный результат, и я хотел бы сделать это новой колонкой Days_till_Pos, от этой первой положительной даты результата я хотел бы подсчитать количество дней до тех пор, пока результаты не будут «не обнаружены», создав новый столбец Days_till_Neg.
Я бы хотел, чтобы данные выглядели так, где результаты сгруппированы по MRN.
В этом случае, если в столбце Result есть числовое значение, оно будет считаться положительным, если в нем указано «Не обнаружено», оно будет считаться отрицательным. Кроме того, если их первый результат положительный, то в Days_till_Pos должно быть указано NA, а если они никогда не получат положительного результата, то в столбце Days_till_Neg также должно быть указано NA.
Name<- c("Doe, John","Doe, Jane","Parker, Peter", "Stark, Tony")
MRN<- c(55555, 66666, 77777, 88888)
Days_till_Pos<- c(NA, NA, NA, 1)
Days_till_Neg<- c(1,0,NA, 1)
CV1<- data.frame(Name, MRN, Days_till_Pos, Days_till_Neg)
Name MRN Days_till_Pos Days_till_Neg
Doe,John 55555 NA 1
Doe, Jane 66666 NA 0
Parker, Peter 77777 NA NA
Stark, Tony 88888 1 1
@ r2evans Да, вы правы, ответ должен был быть NA, я обновил данные и вопрос, чтобы отразить это. Спасибо!
Я не совсем уверен, что это правильно, но буду рад изменить его по мере необходимости.
Первый mutate — убедиться, что у вас есть Collected в формате даты.
После группировки по Name и MRN вы можете использовать сводку для каждого пациента.
Для Days_till_Pos проверьте, является ли первый Result отрицательным. Если это так, то возьмите разницу между датой первого сбора, когда она положительна, и датой первого сбора (которая, как известно, является отрицательной). В качестве альтернативы, если первый результат положительный, просто включите NA.
Для Days_till_Neg проверьте, являются ли результаты all отрицательными. Если да, включите NA. Если нет, то возьмите дату, когда Result отрицательный, но lag (предыдущая дата) результат был положительным. Это обеспечит дату перехода от положительного к отрицательному. Затем вычтите первую дату положительного теста.
Обратите внимание, что это предполагает, что пациенты не колеблются несколько раз между отрицательными и положительными тестами.
library(tidyverse)
CV %>%
mutate(Collected = as.Date(Collected)) %>%
group_by(Name, MRN) %>%
summarise(
Days_till_Pos = ifelse(first(Result) == "Not Detected",
Collected[Result != "Not Detected"][1] - Collected[1],
NA),
Days_till_Neg = ifelse(all(Result == "Not Detected"),
NA,
Collected[Result == "Not Detected" & lag(Result, default = "Not Detected") != "Not Detected"][1] - Collected[Result != "Not Detected"][1])
)
Выход
Name MRN Days_till_Pos Days_till_Neg
<chr> <dbl> <dbl> <dbl>
1 Doe, Jane 66666 NA NA
2 Doe, John 55555 NA 1
3 Parker, Peter 77777 NA NA
4 Stark, Tony 88888 1 1
Спасибо! Что, если я хочу узнать общее количество дней, в течение которых человек был положительным? В некоторых случаях это может включать более 20 тестов в течение одного года.
@T.McMillen Можно ли несколько раз переходить от положительного к отрицательному и обратно? Или только один длинный 20-дневный непрерывный ряд положительного результата теста?
Обычно они могут перемещаться назад/вперед только один раз (поз/нег/поз или нег/поз/нег)
@T.McMillen Если pos/neg/pos - какие дни считаются? Просто первый pos пока отрицательный (и игнорировать вторую группу положительных)? Или все положительные?
На самом деле, было бы здорово, если бы я мог зафиксировать все три дня.
В этом случае, если все результаты являются числовыми (ни один из них не «не обнаружен»), просто возьмите последнюю дату и вычтите первую дату (добавьте 1, чтобы включить)...
В противном случае возьмите последнюю дату положительного результата и вычтите первую дату положительного результата (где предыдущая строка как отрицательная, переход от отрицательного к положительному)
Единственная строка в вашем ожидаемом выводе, которая имеет для меня смысл, — это четвертая. John сразу положительно, разве Pos не должно быть 0? У Питера нет плюсов, почему Neg 1, разве не должно быть 0 или NA?