R:按字符串列表过滤并返回以列表内容

时间:2017-10-20 06:51:53

标签: r regex dataframe filter dplyr

我有一个包含诊断的非常大的数据框,我需要查找匹配,让我们说:     AMI <- c("DI21", "410") 要么     STROKE <- c("DI63", "DI64", "DI60", "DI61")

DB <- data.frame(c("I21", "I210", "D21", "D210")) 
DB$DIAGNOSECOL2 <- c("E21", "E210", "I21", "I211")
names(DB)[1] <- "DIAGNOSECOL1"

我可以使用

执行此操作
library(dplyr)
FILTEREDDB <- dplyr::filter(DB, DATABASE$DIAGNOSECOL1 %in% AMI |
DB$DIAGNOSECOL1 %in% STROKE | DB$DIAGNOSECOL2 %in% AMI | DB$DIAGNOSECOL2 %in% STROKE)

这很好用,但问题是我得到的结果很少,因为有些诊断包含子目录,即“DI210”或“DI211”。所以我想过滤包含或以(以这种方式)列表AMI或STROKE中的值开头的值。

对我来说,似乎解决方案是使用grepl()即

grepl(AMI, DB)

然而我得到警告“参数'模式'的长度> 1并且只使用第一个参数。” (grepl()将我的列表作为 - 列表插入,并且只接受第一个参数)

我能找到的最佳解决方案是:grepl in R to find matches to any of a list of character strings 所以我不情愿地试图跳过列表并直接插入我的价值观来继续我的生活:

dplyr::filter(DB, grepl(c("DI21", "410"), DB$DIAGNOSECOL1 | DB$DIAGNOSECOL2)

但是这没有用 - 我得到了一长串不同的警告,所以当我必须检查几个列时,grel()可能不是要走的路吗?我尝试了其他一些东西,但也没用。我觉得我无法找到答案,这真是令人惊讶,因为这对我来说似乎很基础。

如果你能推荐一个很好的方法来解决这个问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不是100%肯定你想要的输出。我假设您要在不考虑“D”的情况下过滤包含AMI或STROKE模式的行。

该解决方案使用正则表达式量词“?”忽略D:

STROKE_regex <- sub(x = STROKE, pattern = "D", replacement = "D?")
AMI_regex <- sub(x = AMI, pattern = "D", replacement = "D?")


filter_at(DB, vars(contains("DIAGNOSECOL")),
        any_vars(grepl(x = ., pattern = paste(c(AMI_regex, STROKE_regex), collapse = "|"))))    
相关问题