R w NA值的条件和?



我正试图计算给定患者在预先指定的时间段内的检测次数。例如,在患者接受第三剂疫苗后的14至45天内,进行了多少次化验?但是,我不想包括病人接种第四剂疫苗后所做的任何化验。

我的数据集是长格式的,包含一个变量,表示化验完成的每个日期,以及每个疫苗接种日期的变量。下面是我的数据框架的一个人为的例子。

id      assay_date   dose_3_date   dose_4_date
1   1001      20mar2021   22feb2021     17aug2021
2   1001      06jun2021   22feb2021     17aug2021      
3   1001      24sep2021   22feb2021     17aug2021
4   1001      19nov2021   22feb2021     17aug2021
5   1006      29apr2021   02apr2021     .
6   1006      23may2021   02apr2021     .
7   1006      15jun2021   02apr2021     .

我不确定如何将检测日期落在我预先指定的日期范围内的病例求和,同时确保我不包括在第四次疫苗剂量后进行的检测。挑战在于我的数据集中的大多数患者没有接受第四次剂量,因此缺少dose_4_date的值。

我的第一个想法是使用case_when为assay_date在dose_3_date之后14到45天之间的情况制作一个标志,而不是在dose_4_date之后,然后以某种方式将标志相加。以下是我目前为止写的内容:

df %>% mutate(post = case_when(assay_date >= dose_3_date+14 & assay_date <= dose_3_date+45 
& assay_date <= dose_4_date & !is.na(dose_4_date) ~ 1),

post3 = case_when(assay_date >= dose_3_date+60 & assay_date <= dose_3_date+120
& assay_date <= dose_4_date & !is.na(dose_4_date) ~ 1),

post6 = case_when(assay_date >= dose_3_date+135 & assay_date <= dose_3_date+210
& assay_date <= dose_4_date & !is.na(dose_4_date) ~ 1))

上面的代码对于带有dose_4_date的患者工作得很好,但是对于带有"missing"的患者会产生NA值。dose_4_date。我不确定如何忽略缺少dose_4_date的患者的NAs。

我也不确定如何将之后的标志相加。

任何建议将不胜感激!

library(data.table)
# dummy data
df <- data.table(id = rep(c(1,2), times=c(4,3))
, assay_date = c('20mar2021', '06jun2021', '24sep2021', '19nov2021', '29apr2021', '23may2021', '15jun2021')
, dose_3_date = rep(c('22feb2021', '02apr2021'), times=c(4,3))
, dose_4_date = c(rep(c('17aug2021', NA), times=c(4,3)))
); df
# set as data.table if yours isn't one already
setDT(df)
# as.Date
x <- c("assay_date", "dose_3_date", "dose_4_date")
df[, (x) := lapply(.SD, (i) as.Date(i, format="%d%b%Y")), .SDcols=x
][, date_diff := assay_date - dose_3_date   # calculate date diff
]
# flag rows which fit criteria
df[date_diff %between% c(14, 45)
& (assay_date <= dose_4_date
| is.na(dose_4_date)
)
, fits_criteria := 1
]
# count per patient
df[, .(assays_in_period = sum(fits_criteria, na.rm=T)), id]

id assays_in_period
1:  1                1
2:  2                1
library(tidyverse)
df <- tibble::tribble(
~id, ~assay_date, ~dose_3_date, ~dose_4_date,
1001L, "20mar2021",  "22feb2021",  "17aug2021",
1001L, "06jun2021",  "22feb2021",  "17aug2021",
1001L, "24sep2021",  "22feb2021",  "17aug2021",
1001L, "19nov2021",  "22feb2021",  "17aug2021",
1006L, "29apr2021",  "02apr2021",           NA,
1006L, "23may2021",  "02apr2021",           NA,
1006L, "15jun2021",  "02apr2021",           NA
)
df |>
mutate(across(-id, lubridate::dmy)) |>
filter(between(as.integer(assay_date - dose_3_date), 14, 45)
& (assay_date <= dose_4_date | is.na(dose_4_date))) |>
count(id)
#> # A tibble: 2 × 2
#>      id     n
#>   <int> <int>
#> 1  1001     1
#> 2  1006     1

最新更新