R data.table%like%with logical AND

Iva*_* P. 3 r sql-like data.table

我正在尝试构建一个搜索引擎的Shiny应用程序.我根据搜索关键字返回data.table:

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"]
Run Code Online (Sandbox Code Playgroud)

以上内容返回包含A或B的所有字段.如果我想要A和B:

DT[field %like% "A"][field %like% "B"]
Run Code Online (Sandbox Code Playgroud)

是否有一种语法允许我对任意数量的关键字执行上述操作.就像是:

DT[field %like% "A & B & C"]
Run Code Online (Sandbox Code Playgroud)

akr*_*run 12

如果只有两个元素,请单独比较它们,然后&对数据集进行a 和子集

DT[field %like% "A" & field %like% "B"]
#  field
#1: A_B_C
#2: B_A_D
Run Code Online (Sandbox Code Playgroud)

如果有许多字符串比较使用ReduceMap.

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


mto*_*oto 5

或者你可以使用Perl风格的正则表达式,结合grepl你的内部data.table:

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

  • 还可以显示如何从查询转移到该模式,如`query ="A&B"; 库(magrittr); pat =查询%>%sub("^ \\ s*","(?=.*",x =.)%>%sub("\\ s*$",")",x =.)% >%sub("\\ s*&\\ s*",")(?=.*",x =.)` (2认同)