如何计算阳性和阴性结果之间的天数,并为每个R创建新列

mdfafbf1  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(122)

我一直在寻找这个问题的答案,但我一直无法找到一个能帮助我处理包含数字和字符串的列的答案。

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
dtcbnfnu

dtcbnfnu1#

我不能完全肯定这是正确的,但很乐意根据需要进一步修改。
第一个mutate是为了确保您有日期格式的Collected
NameMRN分组后,您可以对每个患者使用summarise。
对于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

相关问题