R 模式匹配与正则表达式的子集 data.table
Posted
技术标签:
【中文标题】R 模式匹配与正则表达式的子集 data.table【英文标题】:R pattern matching with regex for subsetting 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
【问题讨论】:
【参考方案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="|"), "$")
;这样,不太可能匹配太多。以上是关于R 模式匹配与正则表达式的子集 data.table的主要内容,如果未能解决你的问题,请参考以下文章