gpt4 book ai didi

r - 使用 grep 查找 "cancer"但排除 "previous cancer"

转载 作者:行者123 更新时间:2023-12-04 08:05:40 24 4
gpt4 key购买 nike

我只是想首先说我对编码很陌生,所以我可能没有使用正确的术语,但我会尽力而为,如果有什么不合理的地方,请告诉我:)
基本上,我有一组输入错误的数据。有一个合并症列/对象,其中以字符形式输入患者的整个合并症列表(包括一大堆其他不相关的数据。)
数据示例:
“乳腺癌以前的酒精过量 ihd cks”
“既往乳腺癌谵妄 pvd 肺栓塞”
“AF心力衰竭结肠癌”
我正在尝试计算患者的合并症数量。我有一份 list ,列出了哪些可以算作合并症,哪些不算。我的计划(我认为这不是最好的)是使用 grep 来识别合并症的名称并为每组合并症创建一个新对象)。
例如,在心力衰竭合并症组下,数据中任何显示“ihd”、“心力衰竭”或“心力衰竭”的内容都将归入心力衰竭:

heartfailure <- grep("^ihd|heart failure|cardiac failure",
comorb, value=FALSE)
输出作为具有指定合并症的行号出现,然后我将其转换为字符。我将对每个合并症组执行此操作,然后计算出现行号的总次数,这将是患者合并症的总数(数据中的每一行代表一个患者)。
问题出现在合并症中,这些合并症具有不应作为合并症包括在内的先前疾病。
例如,“乳腺癌”是一种合并症,而“既往乳腺癌”则不是。
我试过了
grep("!previous breast cancer| breast cancer",
comorb, value= FALSE)
但它会返回任何含有乳腺癌的东西,即使它有以前的乳腺癌。
另一个问题是,由于数据输入不当,每一行都可能有一个与另一种合并症相关的先前疾病,而与乳腺癌无关(例如,先前饮酒过量),因此如果条件允许,我会错误地排除该行因为排除只是“前一个”,(即前一个必须在乳腺癌之前出现,我才能排除这一行。)
这个问题有方法解决吗?
非常感谢

最佳答案

很难提供完整的解决方案,因为我们无法访问完整的数据集或合并症术语列表。但也许我们可以提供一些可能帮助您构建解决方案的想法。
首先,在处理列中的文本时,tidytext package非常有用。
其次,我建议尝试在一个数据框中工作。为此,您会发现 the dplyr package有用:特别是mutatecase_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

关于r - 使用 grep 查找 "cancer"但排除 "previous cancer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66233272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com