我正在处理一个临床数据表,其中包含大约 15 年期间数十万人的医院事件。我已经清理了数据表,现在将其格式化为每集一行,每一行都包含该集的日期以及相关的主要和次要诊断(最多 20 个次要诊断)。诊断列包含 ICD-10 疾病代码字符串。
我有兴趣从该表中提取大约 60 种病症的数据,每种病症都由不同数量的临床代码组成(例如哮喘有 5 个相关的 ICD-10 代码,焦虑症有 3 个代码,莱姆病有 3 个代码......) 。我想编写一个函数来搜索所有主要和次要诊断列,检查与 60 个条件关联的任何字符串,并创建一个二进制是/否输出,如果有任何关联的 ICD,则该输出编码为 1代码存在,否则为 0。
我已经弄清楚如何仅在主要诊断列('diag_icd10')上使用 grepl 内的 ifelse 内的 mutate 来执行此操作,但必须编写许多行代码才能获得我想要的所有 60 个条件。下面的简化示例...
anxiety_codes <- c("F400", "F401", "F402")
asthma_codes <- c("J450", "J451", "J458", "J459", "J46X")
chronic_lyme_codes <- c("A692", "G630", "M012")
# Checking primary diagnosis column 'diag_icd10'
data <- data |>
mutate(
anxiety_prim = ifelse(grepl(paste(anxiety_codes, collapse = '|'), diag_icd10), 1, 0),
asthma_prim = ifelse(grepl(paste(asthma_codes, collapse = '|'), diag_icd10), 1, 0),
lymedisease_prim = ifelse(grepl(paste(chronic_lyme_codes, collapse = '|'), diag_icd10), 1, 0))
我的问题是:
condition_prim
变量,而无需编写 60 多行代码。"condition"_sec
变量,无论条件是否满足是否在场。condition
变量,无论条件是否存在。创建一个数据框codesDF,将代码和条件关联起来,并创建一个测试输入数据框DF。然后加入他们并使用
model.matrix
。
library(dplyr)
# codes has icd10 and condn columns and data has icd10 column
make01 <- function(data, codes) {
data %>%
left_join(codes) %>%
mutate(model.matrix(~ condn - 1, .) %>% as.data.frame) %>%
setNames(sub("condn(.*)_codes", "\\1", x = names(.)))
}
# test - inputs are data frame associating codes and conditions, codesDF,
# and input data frame, DF
anxiety_codes <- c("F400", "F401", "F402")
asthma_codes <- c("J450", "J451", "J458", "J459", "J46X")
chronic_lyme_codes <- c("A692", "G630", "M012")
codesDF <- mget(ls(pattern = "_codes$")) %>%
stack() %>%
setNames(c("icd10", "condn"))
DF <- setNames(codesDF[1], "icd10") # test input data frame
make01(DF, codesDF)
给予
Joining with `by = join_by(icd10)`
icd10 condn anxiety asthma chronic_lyme
1 F400 anxiety_codes 1 0 0
2 F401 anxiety_codes 1 0 0
3 F402 anxiety_codes 1 0 0
4 J450 asthma_codes 0 1 0
5 J451 asthma_codes 0 1 0
6 J458 asthma_codes 0 1 0
7 J459 asthma_codes 0 1 0
8 J46X asthma_codes 0 1 0
9 A692 chronic_lyme_codes 0 0 1
10 G630 chronic_lyme_codes 0 0 1
11 M012 chronic_lyme_codes 0 0 1