【问题标题】:R pattern matching with regex for subsetting data.tableR 模式匹配与正则表达式的子集 data.table
【发布时间】:2022-01-05 16:49:48
【问题描述】:

我需要进行模式匹配以用于对 data.table 进行子集化。我不确定如何使用转义或任何带有通配符的正确语法。 MWE在这里:

library(data.table)
code_id <- data.table (c("pat11",
                         "pat11",
                         "pat21",
                         "pat22",
                         "x05ZX",
                         "x05q2",
                         "x05qb",
                         "x05td",
                         "x05xd",
                         "x05qb"))

codes <- c("pat2.", "x05td", "x05q.")

unique (code_id[code_id %in% codes])

这将返回一个空向量。我想对 code_id 进行子集化并只保留代码“pat21”、“pat22”、“x05td”、“x05q2”和“x05qb”?我猜问题是试图在值列表的中间进行正则表达式匹配 我如何需要“转义”或格式化“。”所以它被视为通配符?谢谢。 J

【问题讨论】:

    标签: r regex data.table subset


    【解决方案1】:

    两种可能的解决方案: 两者共同的想法是将codes 转换为交替模式,其中单独的元素由| 连接(注意:我已经删除了codes 中的.,因为这是一个正则表达式元字符)

    使用dplyr

    library(dplyr)
    library(stringr)
    code_id %>% filter(str_detect(V1, paste0(codes, collapse = "|")))
          V1
    1: pat21
    2: pat22
    3: x05q2
    4: x05qb
    5: x05td
    6: x05qb
    

    使用base R

    code_id[grepl(paste0(codes, collapse = "|"), V1)]
          V1
    1: pat21
    2: pat22
    3: x05q2
    4: x05qb
    5: x05td
    6: x05qb
    

    数据:

    codes <- c("pat2", "x05td", "x05q")
    
    code_id <- data.table (c("pat11",
                             "pat11",
                             "pat21",
                             "pat22",
                             "x05ZX",
                             "x05q2",
                             "x05qb",
                             "x05td",
                             "x05xd",
                             "x05qb"))
    

    【讨论】:

    • 谢谢克里斯,这些肯定会奏效。我仍然有一个问题,因为在实际的真实示例中,我必须匹配多个代码,所以我正在寻找类似于 "codes
    • 没有完全的意义。请用更现实的例子更新您的问题,但组合多种模式根本不是问题
    • 已编辑解决方案以适应多种模式
    • 通过包含^$,这可能会更严格一些(如果需要/需要),例如paste0("^", paste(codes, collapse="|"), "$");这样,不太可能匹配太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多