r - 使用 %in% 运算符在 R 中进行部分字符串匹配?
问题描述
我很想知道是否可以使用 R 中的 %in% 运算符进行部分字符串匹配。我知道有很多方法可以使用 stringr 等来查找部分字符串匹配,但是我当前的代码使用起来更容易%in% 运算符。
例如,想象一下这个向量:
x <- c("Withdrawn", "withdrawn", "5-Withdrawn", "2-WITHDRAWN", "withdrawnn")
我希望每个都是 TRUE,因为字符串包含“Withdrawn”,但只有第一个是 TRUE:
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() 好用,所以我不会关心区分大小写;然而,对我来说重要的是代码会触发“撤回”、“撤回”和“5-撤回”。
编辑:这个问题被标记为这个问题的副本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
:模式匹配是不对称的,您不能交换左侧和右侧。如果您只想将列表与单个正则表达式匹配,请grepl
直接使用:
〉grepl("(?i)Withdrawn", x)
[1] TRUE TRUE TRUE TRUE TRUE
或者,如果您更喜欢使用运算符:
`%matches%` = grepl
〉"(?i)Withdrawn" %matches% x
[1] TRUE TRUE TRUE TRUE TRUE
推荐阅读
- arrays - 使用 Dart 解析没有键的 JSON 数组
- machine-learning - 无法在 DialogFlow 上匹配没有空格的两个实体
- c++ - uint32_t 如何保证 32 位?
- amazon-dynamodb - DynamoDB 上的数据屏蔽
- selenium - Internet Explorer 11 在通过 IEDriverServer 和 Selenium 执行测试时随机卡住
- buildbot - 如何向 master 注册 Buildbot worker?
- javascript - 移动设备上的网页文本在收到来自我们的 mqtt 代理的消息时会变大
- expect - 无法验证被解析为期望脚本的参数
- python - Not Null 约束失败 完整性错误
- google-cloud-storage - React-360 图像 URI 不可见