首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用grep查找“癌症”但排除“以前的癌症”

使用grep查找“癌症”但排除“以前的癌症”
EN

Stack Overflow用户
提问于 2021-02-17 06:48:24
回答 1查看 99关注 0票数 2

我首先想说的是,我是编程新手,所以我可能不会使用正确的术语,但我会尽我最大的努力,如果有什么不合理的地方,请告诉我:)

基本上,我有一组输入错误的数据。有一个共病列/对象,其中患者的整个共病列表被输入为字符(包括一整串其他不相关的数据)。

数据看起来像的例子:“乳腺癌既往酒精过量ihd cks”“既往乳腺癌神志不清pvd肺栓塞”"af心力衰竭结肠癌“

我在试着计算一个病人的合并症的数量。我的计划(我认为不是最好的)是使用grep来识别共病的名称,并为每组共病创建一个新的对象)。

例如,在心力衰竭共病组下,数据中任何显示"ihd“、”心力衰竭“或”心力衰竭“的数据都将被归入心力衰竭:

代码语言:javascript
复制
heartfailure <- grep("^ihd|heart failure|cardiac failure",
     comorb, value=FALSE)

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

这个问题出现在有既往病史的合并症中,不应被纳入为合并症。

例如,“乳腺癌”将是一种共病,但“既往乳腺癌”不会。

我试过了

代码语言:javascript
复制
grep("!previous breast cancer| breast cancer",
     comorb, value= FALSE)

但它会返回任何包含乳腺癌的内容,即使它有乳腺癌之前的记录。

另一个问题是,由于数据输入得不好,每一行都可能有与另一种共病相关的前科,而与乳腺癌无关(例如。以前的酒精过量),所以如果排除的条件只是“以前”,我将错误地排除这一行,(即。前一个必须在乳腺癌之前出现,我才能排除这一争执。)

对此有解决方案吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 08:01:43

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

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

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

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

代码语言:javascript
复制
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来定义共病。在这里,您可以添加任意数量的规则,以获得所需的结果。

代码语言:javascript
复制
# 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_
         ))

结果:

代码语言:javascript
复制
   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不会返回:

代码语言:javascript
复制
comorbidities %>% 
  filter(!is.na(comorb), 
         is_previous == 0) %>% 
  count(patient_id, name = "comorbidities")

  patient_id comorbidities
1          1             1
2          3             2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66233272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档