2016-10-19 70 views
2

我正在尝试构建一个Shiny应用程序,它是一个搜索引擎。 我基于搜索的关键字返回data.table:R data.table%like%with logical AND

DT <- data.table(field = c("A_B_C","A_C_D","A_D_A","B_A_D","B_C_F","B_D_K")) 

DT[field %like% "A|B"] 

以上返回包含A或B 各个领域。如果我想有一个& B:

DT[field %like% "A"][field %like% "B"] 

有没有一个语法,将允许我为任何数量的关键字做上述操作。 喜欢的东西:

DT[field %like% "A & B & C"] 
+1

听起来像是不错的FR为'%inlike%' – jangorecki

回答

5

如果只有两个元素,分别对它们进行比较,然后做一个&和子集的数据集

DT[field %like% "A" & field %like% "B"] 
# field 
#1: A_B_C 
#2: B_A_D 

如果有很多的字符串比较使用ReduceMap

DT[Reduce(`&`, Map(`%like%`, list(field), c("A", "B")))] 
# field 
#1: A_B_C 
#2: B_A_D 
4

或者你可以使用Perl样式正则表达式,结合grepl里面你data.table

pat <- "(?=.*A)(?=.*B)" 
DT[grep(pat, field, perl = TRUE),] 
# field 
#1: A_B_C 
#2: B_A_D 
+2

也可以显示如何移动从一个查询到该模式,如'query =“A(012),(”=“,”=“)。 %>% sub(“\\ s * $”,“)”,x =。)%>% sub(“\\ s *&\\ s *”,“)(?=。*”,x =。) ' – Frank

+0

使用诸如'terms < - c(“A”,“B “)',你可以使用'DT [grepl(paste(sprintf(”(?=。*%s)“,terms),collapse =”“),field,perl = TRUE)]''。 – dnlbrky