首页 > 解决方案 > 使用 grep 查找“癌症”但排除“以前的癌症”

问题描述

我只想首先说我对一般编码很陌生,所以我可能没有使用正确的术语,但我会尽力而为,如果有什么不明白的地方请告诉我:)

基本上,我有一组非常糟糕的输入数据。有一个合并症列/对象,其中患者合并症的整个列表作为字符输入(包括一大堆其他不相关的数据。)

数据示例:“乳腺癌既往酒精过量 ihd cks”“既往乳腺癌谵妄 pvd 肺栓塞”“AF 心力衰竭结肠癌”

我正在尝试计算患者的合并症数量。我有一份清单,列出了哪些是合并症,哪些不是。我的计划(我认为这不是最好的)是使用 grep 来识别合并症的名称并为每组合并症创建一个新对象)。

例如,在心力衰竭合并症组下,数据中包含“ihd”、“心力衰竭”或“心力衰竭”的任何内容都将被归为心力衰竭:

heartfailure <- grep("^ihd|heart failure|cardiac failure",
     comorb, value=FALSE)

输出作为具有指定合并症的行号出现,然后我将其转换为字符。我将为每个合并症组执行此操作,然后计算行号出现的总次数,这将是患者合并症的总数(数据中的每一行代表一位患者)。

问题出现在具有先前不应被包括为合并症的合并症上。

例如,“乳腺癌”是一种合并症,但“既往乳腺癌”不是。

我努力了

grep("!previous breast cancer| breast cancer",
     comorb, value= FALSE)

但它会返回任何含有乳腺癌的东西,即使它之前有过乳腺癌。

另一个问题是,由于数据输入错误,每一行都可能有一个与另一种合并症相关的前一个数据,而不是与乳腺癌有关(例如,以前的酒精过量),所以如果出现这种情况,我会错误地排除该行因为排除只是“以前的”,(即前一个必须在乳腺癌之前出现,我才能排除这一行。)

有针对这个的解决方法吗?

非常感谢

标签: r

解决方案


很难提供完整的解决方案,因为我们无法访问完整的数据集或合并症术语列表。但也许我们可以提供一些想法来帮助您构建解决方案。

首先,在处理列中的文本时,tidytext 包非常有用。

其次,我建议尝试在一个数据框架内工作。为此,您会发现dplyr 包很有用:尤其是mutateandcase_when函数。

这是一个例子。使用您的数据:

df1 <- data.frame(patient_id = 1:3,
                  description = c("breast cancer previous alcohol excess ihd cks",
                                  "previous breast cancer delirium pvd pulmonary embolus",
                                  "af heart failure colon cancer"))
df1

  patient_id                                           description
1          1         breast cancer previous alcohol excess ihd cks
2          2 previous breast cancer delirium pvd pulmonary embolus
3          3                         af heart failure colon cancer

我们可以使用tidytext::unnest_tokens将描述分解为单个单词,将单词存储在原始文本旁边的新列中。

然后我们可以用它dplyr::lag来检查一个单词前面是否有“previous”这个词,如果是则标记这个词。

接下来,我们可以用它case_when来定义合并症。您可以在此处添加任意数量的规则以实现所需的结果。

# install these first
library(dplyr)
library(tidytext)

comorbidities <- df1 %>% 
  tidytext::unnest_tokens(terms, description, drop = FALSE) %>% 
  mutate(is_previous = ifelse(lag(terms) == "previous", 1, 0),
         comorb = case_when(
           terms == "ihd" ~ "heart failure",
           terms == "heart" & lead(terms) == "failure" ~ "heart failure",
           terms == "breast" & lead(terms) == "cancer" ~ "breast cancer",
           terms == "colon" & lead(terms) == "cancer" ~ "colon cancer",
           TRUE ~ NA_character_
         ))

结果:

   patient_id                                           description     terms is_previous        comorb
1           1         breast cancer previous alcohol excess ihd cks    breast          NA breast cancer
2           1         breast cancer previous alcohol excess ihd cks    cancer           0          <NA>
3           1         breast cancer previous alcohol excess ihd cks  previous           0          <NA>
4           1         breast cancer previous alcohol excess ihd cks   alcohol           1          <NA>
5           1         breast cancer previous alcohol excess ihd cks    excess           0          <NA>
6           1         breast cancer previous alcohol excess ihd cks       ihd           0 heart failure
7           1         breast cancer previous alcohol excess ihd cks       cks           0          <NA>
8           2 previous breast cancer delirium pvd pulmonary embolus  previous           0          <NA>
9           2 previous breast cancer delirium pvd pulmonary embolus    breast           1 breast cancer
10          2 previous breast cancer delirium pvd pulmonary embolus    cancer           0          <NA>
11          2 previous breast cancer delirium pvd pulmonary embolus  delirium           0          <NA>
12          2 previous breast cancer delirium pvd pulmonary embolus       pvd           0          <NA>
13          2 previous breast cancer delirium pvd pulmonary embolus pulmonary           0          <NA>
14          2 previous breast cancer delirium pvd pulmonary embolus   embolus           0          <NA>
15          3                         af heart failure colon cancer        af           0          <NA>
16          3                         af heart failure colon cancer     heart           0 heart failure
17          3                         af heart failure colon cancer   failure           0          <NA>
18          3                         af heart failure colon cancer     colon           0  colon cancer
19          3                         af heart failure colon cancer    cancer           0          <NA>

然后你可能会使用dplyr::filter只返回你想要的行。例如,要删除没有合并症的行和标记为“以前”的行,然后计算患者数。请注意,在这种情况下不会返回患者 2:

comorbidities %>% 
  filter(!is.na(comorb), 
         is_previous == 0) %>% 
  count(patient_id, name = "comorbidities")

  patient_id comorbidities
1          1             1
2          3             2

推荐阅读