首页 > 解决方案 > 是否有一个 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

标签: rstring

解决方案


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)

部分匹配可以接受的可能性有很多,可以通过costsin进行调整adist


推荐阅读