检查一个数据框列中的值或模式与另一列,以查看是否显示匹配

时间:2018-02-07 08:07:52

标签: r string match

我有一份品牌药物清单,我需要检查它们是否存在于患者医疗清单中。患者医疗清单主要列为通用表格,但我需要检查是否输入了品牌并将其更改为通用。患者的药物列表包含药物加列中的指示。我的目标是创建一个列,标记品牌是否显示为“是”“否”或真假。我的数据集包含大约5000个品牌名称条目,患者列表包含大约60000个条目。我不知道从哪里开始,因为从品牌列表到患者列表的模式不同。患者医疗清单中的资本化也不一致。任何帮助表示赞赏。

示例数据集:MRN是患者ID

Brand <- c("Evista", "Rozerem", "Altace")

MRN <- c("121212", "121212", "231212", "432123", "432123", "542345", 
"323412", "242341", "412111", "642321")

MedList <- c("raloxifene 60mg daily", "Rozerem 8mg daily", "evista 60mg 
daily", "metoprolol tartate 25mg twice daily", "ramelteon 8mg daily", 
"ramipril 5mg daily", "omeprazole 20mg daily", "ALTACE 5mg nightly", 
"ramelteon 8mg daily", "imatinib 400mg daily")

Patients <- data.frame(MRN,MedList)

我的目标是最终得到像这样的东西

inlist <- c(FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
FALSE)

Patients <- cbind(Patients, inlist)

谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

grepl(paste(toupper(Brand), collapse = '|'), toupper(MedList))
 [1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

答案 1 :(得分:0)

如果只是大写但不是拼写问题,grepl应该做你想做的事情:

grepl(paste0(Brand, collapse = "|"), MedList, ignore.case = TRUE)

如果您的pattern(即“品牌”)是一个非常长的向量,您可以使用 stringr 中的str_detect()。它更快,支持更长的模式(但它没有ignore.case参数)。

stringr::str_detect(tolower(MedList), paste0(tolower(Brand), collapse = "|"))