r - 是否有一个 R 函数,只有在没有完全匹配的情况下才会自动从完全匹配切换到部分匹配
问题描述
我正在寻找一个 R 函数(如果可能在现有的知名包中),它将字符串与模式匹配并返回 i)第一个完全匹配的元素,或者,如果没有完全匹配 ii)第一个元素部分匹配。
到目前为止,我使用以下方法修补了一些东西grep
:
data <- c("a", "a b", "c d e", "c d")
my_match <- function(data, pattern) {
if (pattern %in% data) {
return(which(pattern == data)[1])
} else {
return(grep(pattern, data, fixed = FALSE)[1])
}
}
以及一些具有预期结果的测试用例:
my_match(data, "b")
[1] 2
my_match(data, "a")
[1] 1
my_match(data, "a b")
[1] 2
my_match(data, "c")
[1] 3
my_match(data, "e")
[1] 3
my_match(data, "c d")
[1] 4
- 是否存在行为相同的预先存在的功能?
- 如果没有:是否有更简洁的方法来创建相同的行为?(我的代码似乎有点混乱..)
解决方案
match
如果没有命中,您可以adist
使用which.min
.
my_match <- function(data, pattern) {
i <- match(pattern, data)
if(is.na(i)) {
i <- grep(pattern, data)
i[which.min(adist(pattern, data[i], partial=TRUE))]
} else i
}
my_match(data, "b")
#[1] 2
my_match(data, "a")
#[1] 1
my_match(data, "a b")
#[1] 2
my_match(data, "c")
#[1] 3
my_match(data, "e")
#[1] 3
my_match(data, "c d")
#[1] 4
my_match(data, "x")
#integer(0)
部分匹配可以接受的可能性有很多,可以通过costs
in进行调整adist
。
推荐阅读
- api - BambooHR API 未提供完整的员工详细信息
- spring-boot - 外部化从 SCDF 启动的任务或作业的 application.properties
- python - 如何使用 TFBertModel 的隐藏状态作为自定义 Keras 模型的一部分?
- c - 使用预处理器的顺序函数名称
- iis - 使用应用程序池对 Web 应用程序进行身份验证
- android - 当应用程序不在后台时,深层链接崩溃
- ruby-on-rails - Rails - 仅在开发中允许在 CORS 设置中使用 localhost
- flutter - Flutter:如何使用响应式构建器
- excel - 在 Excel 中将多列数据合并为两列
- html - 防止加载谷歌字体时显示后备字体