使用 %in% 运算符在 R 中进行部分字符串匹配?
Partial String Match in R using the %in% operator?
我很想知道是否可以在 R 中使用 %in% 运算符进行部分字符串匹配。我知道有很多方法可以使用 stringr 等来查找部分字符串匹配,但是我的当前代码使用 %in% 运算符更容易工作。
例如,想象一下这个向量:
x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")
我希望每个都为真,因为字符串包含 "Withdrawn",但只有第一个为真:
x %in% c("Withdrawn")
[1] TRUE FALSE FALSE FALSE FALSE
我尝试使用正则表达式至少使其不区分大小写,但这使所有内容都为假:
x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE
那么,是否可以使用带有包装器的 %in% 运算符对所有这些都产生 TRUE?因为使用 tolower() 或 toupper() 很容易,所以我不 as 关心区分大小写;但是,代码会触发 "withdrawn"、"withdrawnn" 和“5-withdrawn”对我来说很重要。
编辑:这个问题被标记为这个问题的重复Case-insensitive search of a list in R;但是,它是不同的,因为它询问是否可以使用 %in% 运算符进行部分字符串匹配。链接的问题根本不使用 %in% 运算符。
%in%
不支持这个:它是 match
函数的包装器,它使用相等比较来建立匹配,而不是正则表达式匹配。但是,您可以实现自己的:
`%rin%` = function (pattern, list) {
vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}
这可以像 %in%
:
〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE
请注意,结果与您对 grepl
的预期工作要求不同:模式匹配是 非对称,您不能交换左右right-hand 边。如果你只是想将一个列表与单个正则表达式进行匹配,直接使用 grepl
:
〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE
或者,如果您更喜欢使用运算符:
`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE
我很想知道是否可以在 R 中使用 %in% 运算符进行部分字符串匹配。我知道有很多方法可以使用 stringr 等来查找部分字符串匹配,但是我的当前代码使用 %in% 运算符更容易工作。
例如,想象一下这个向量:
x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")
我希望每个都为真,因为字符串包含 "Withdrawn",但只有第一个为真:
x %in% c("Withdrawn")
[1] TRUE FALSE FALSE FALSE FALSE
我尝试使用正则表达式至少使其不区分大小写,但这使所有内容都为假:
x %in% c("(?i)Withdrawn")
[1] FALSE FALSE FALSE FALSE FALSE
那么,是否可以使用带有包装器的 %in% 运算符对所有这些都产生 TRUE?因为使用 tolower() 或 toupper() 很容易,所以我不 as 关心区分大小写;但是,代码会触发 "withdrawn"、"withdrawnn" 和“5-withdrawn”对我来说很重要。
编辑:这个问题被标记为这个问题的重复Case-insensitive search of a list in R;但是,它是不同的,因为它询问是否可以使用 %in% 运算符进行部分字符串匹配。链接的问题根本不使用 %in% 运算符。
%in%
不支持这个:它是 match
函数的包装器,它使用相等比较来建立匹配,而不是正则表达式匹配。但是,您可以实现自己的:
`%rin%` = function (pattern, list) {
vapply(pattern, function (p) any(grepl(p, list)), logical(1L), USE.NAMES = FALSE)
}
这可以像 %in%
:
〉'^foo.*' %rin% c('foo', 'foobar')
[1] TRUE
请注意,结果与您对 grepl
的预期工作要求不同:模式匹配是 非对称,您不能交换左右right-hand 边。如果你只是想将一个列表与单个正则表达式进行匹配,直接使用 grepl
:
〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE
或者,如果您更喜欢使用运算符:
`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE