Как рассчитать дни между положительными и отрицательными результатами и создать новые столбцы для каждого с помощью R

Я искал ответ на этот вопрос, но не смог найти ответ, который помог бы мне со столбцом с числами и строками. Мои данные выглядят так

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

Единственная строка в вашем ожидаемом выводе, которая имеет для меня смысл, — это четвертая. John сразу положительно, разве Pos не должно быть 0? У Питера нет плюсов, почему Neg 1, разве не должно быть 0 или NA?

r2evans 10.01.2023 15:36

@ r2evans Да, вы правы, ответ должен был быть NA, я обновил данные и вопрос, чтобы отразить это. Спасибо!

T.McMillen 10.01.2023 16:13
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
2
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не совсем уверен, что это правильно, но буду рад изменить его по мере необходимости.

Первый 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 13.01.2023 20:19

@T.McMillen Можно ли несколько раз переходить от положительного к отрицательному и обратно? Или только один длинный 20-дневный непрерывный ряд положительного результата теста?

Ben 13.01.2023 20:21

Обычно они могут перемещаться назад/вперед только один раз (поз/нег/поз или нег/поз/нег)

T.McMillen 13.01.2023 20:23

@T.McMillen Если pos/neg/pos - какие дни считаются? Просто первый pos пока отрицательный (и игнорировать вторую группу положительных)? Или все положительные?

Ben 13.01.2023 20:24

На самом деле, было бы здорово, если бы я мог зафиксировать все три дня.

T.McMillen 13.01.2023 20:29

Ben 13.01.2023 20:39

В этом случае, если все результаты являются числовыми (ни один из них не «не обнаружен»), просто возьмите последнюю дату и вычтите первую дату (добавьте 1, чтобы включить)...

Ben 13.01.2023 20:39

В противном случае возьмите последнюю дату положительного результата и вычтите первую дату положительного результата (где предыдущая строка как отрицательная, переход от отрицательного к положительному)

Ben 13.01.2023 20:40

Другие вопросы по теме