我正在处理一个临床数据表,其中包含了大约15年期间数十万人的住院病历.我已经清理了我的数据表,现在格式为每集一行,每行都包含该集的日期以及相关的初级和次级诊断(最多20个次级诊断).诊断列包含ICD-10疾病代码字符串.

我有兴趣从这张表中提取大约60种疾病的数据,每种疾病都由数量可变的临床代码组成(例如,哮喘有五个相关的ICD-10代码,焦虑3代码,莱姆病3代码……).我想要编写一个函数来搜索所有的主要和次要诊断列,判断与60个条件相关联的任何字符串,并创建一个二进制是/否输出,如果存在任何相关的ICD代码,则编码为1,否则为0.

我已经弄清楚了如何仅在主诊断列(‘diag_icd10’)上使用muplate内的ifElse中的grepl来完成此操作,但是必须跨很多行代码才能针对所有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变量,无论条件是否存在.

推荐答案

以下是使用示例数据的一种方法.您可以创建诊断向量的命名列表:

anxiety_codes <- c("F400", "F401", "F402")
asthma_codes <- c("J450", "J451", "J458", "J459", "J46X")
chronic_lyme_codes <- c("A692", "G630", "M012")

dx_list <- mget(ls(pattern = "(\\w+)_codes"))
names(dx_list) <- sub("_codes$", "", names(dx_list))

dx_list

它看起来像这样:

$anxiety
[1] "F400" "F401" "F402"

$asthma
[1] "J450" "J451" "J458" "J459" "J46X"

$chronic_lyme
[1] "A692" "G630" "M012"

我制作了一个包含id、主要诊断代码和几个次要诊断代码的示例数据框.

df <- data.frame(
  id = 1:3,
  diag_icd10 = c("F400", "J458", "M012"),
  sec_diag_0 = c("J450", NA, "J46X"),
  sec_diag_1 = c(NA, NA, "F401")
)

以下是数据.框架:

  id diag_icd10 sec_diag_0 sec_diag_1
1  1       F400       J450       <NA>
2  2       J458       <NA>       <NA>
3  3       M012       J46X       F401

您可以在诊断列表中使用sapply,并首先判断主要诊断列,并将列名更改为包括"Prim"作为主要诊断.对于二次诊断,在多列中使用Reducelapply,然后为二次诊断加上后缀"sec".

df_result <- cbind(
  df[1],
  setNames(
    as.data.frame(sapply(dx_list, \(x) +(df[,2] %in% x))),
    paste(names(dx_list), "prim", sep = "_")
  ),
  setNames(
    as.data.frame(sapply(dx_list, \(x) +Reduce(`|`, lapply(df[,3:4], `%in%`, x)))),
    paste(names(dx_list), "sec", sep = "_")
  )
)

结果看起来是这样的:

  id anxiety_prim asthma_prim chronic_lyme_prim anxiety_sec asthma_sec chronic_lyme_sec
1  1            1           0                 0           0          1                0
2  2            0           1                 0           0          0                0
3  3            0           0                 1           1          1                0

您可以组合LIKE列并添加其他摘要(一次或二次诊断):

sapply(split.default(df_result[-1], sub("_(prim|sec)$", "", names(df_result[-1]))),
       \(x) +(rowSums(x) > 0))

其输出如下(如果需要,可以添加到df_result):

     anxiety asthma chronic_lyme
[1,]       1      1            0
[2,]       0      1            0
[3,]       1      1            1

或者,如果您只想一次处理所有列,请try :

cbind(
  df[1],
  setNames(
    as.data.frame(sapply(dx_list, \(x) +(df[,2] %in% x))),
    paste(names(dx_list), "prim", sep = "_")
  ),
  setNames(
    as.data.frame(sapply(dx_list, \(x) +Reduce(`|`, lapply(df[,3:4], `%in%`, x)))),
    paste(names(dx_list), "sec", sep = "_")
  ),
  sapply(dx_list, \(x) +Reduce(`|`, lapply(df[,2:4], `%in%`, x)))
)

R相关问答推荐

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

将年度数据插入月度数据

在不安装软件包的情况下测试更新

修改用R编写的用户定义函数

在R中使用download. file().奇怪的URL?

条形图和在Ploly中悬停的问题

我正在努力用R计算数据集中的中值逐步距离

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

将列的值乘以在不同数据集中找到的值

层次树图的数据树

计算Mean by分组和绑定到R中的数据集

快速合并R内的值

名字的模糊匹配

如何在Quarto中使用美人鱼图表中的标记来加粗文本

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

如何在一种 colored颜色 中设置数值变量的 colored颜色 和高于阈值的 colored颜色 点?

将Geojson保存为R中的shapefile

基于已有ID列创建唯一ID

如何根据顺序/序列从数据框中排除值