【问题标题】:R data.table %like% with logical ANDR data.table %like% 与逻辑 AND
【发布时间】:2016-10-19 12:00:50
【问题描述】:

我正在尝试构建一个作为搜索引擎的 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"]

以上返回所有包含 A OR B 的字段。 如果我想要 A 和 B:

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

是否有一种语法可以让我对任意数量的关键字执行上述操作。 比如:

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

【问题讨论】:

  • 对于%inlike% 来说听起来是个不错的 FR

标签: r data.table sql-like


【解决方案1】:

如果只有两个元素,分别比较它们,然后做一个&amp; 并子集数据集

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

【讨论】:

    【解决方案2】:

    或者你可以使用 Perl-style 正则表达式,在你的data.table 中结合grepl

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

    【讨论】:

    • 还可以显示如何从查询转移到该模式,例如 query = "A &amp; B"; library(magrittr); pat = query %&gt;% sub("^\\s*", "(?=.*", x = .) %&gt;% sub("\\s*$", ")", x = .) %&gt;% sub("\\s*&amp;\\s*", ")(?=.*", x = .)
    • 使用terms &lt;- c("A", "B")之类的搜索词向量,您可以使用DT[grepl(paste(sprintf("(?=.*%s)", terms), collapse=""), field, perl=TRUE)]
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2017-03-17
    • 2021-09-24
    相关资源
    最近更新 更多