跨多列搜索多个字符串并创建二进制输出变量的功能

问题描述 投票:0回答:1

我正在处理一个临床数据表,其中包含大约 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)) 

我的问题是:

  1. 我想让这个函数检查所有 60 个条件并创建二进制
    condition_prim
    变量,而无需编写 60 多行代码。
  2. 我还想创建一个类似的函数,检查相同的字符串模式,但跨多个辅助诊断列(总共 21 列...'sec_diag_0':'sec_diag_20')并返回到
    "condition"_sec
    变量,无论条件是否满足是否在场。
  3. 要将两者合并,请检查主列和辅助列,并返回单个
    condition
    变量,无论条件是否存在。
r function grepl
1个回答
0
投票

创建一个数据框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
© www.soinside.com 2019 - 2024. All rights reserved.