R部分字符串匹配项

问题描述 投票:0回答:1

我有

x <- c("DOL3", "AnnA", "CAT5", "Johna", "543QLARA", "Poro")
y <- c("DOL5", "ANNA", "CAT5", "John", "3QLAR", "Sam")

并且我想要一个函数,以便提供如下匹配项:

my_function(x, y)

[1] 1,2,3,4,5,NA

详细信息:我需要找到部分字符串匹配,它们以相同的开头或结尾,或中间有一些相同的字母(例如,默认值为3个连续的匹配字母)。无论是否使用大写字母,我还需要该函数进行匹配。

[如果有人熟悉该方法,请提供帮助。谢谢。

r matching string-matching partial partial-matches
1个回答
0
投票

我认为可以用三种不同的逻辑条件来解决问题:

  1. [前三个字母相等
  2. 最后三个字母相等
  3. x(全部)是y的一部分,反之亦然

我知道条件(3)不完整。仅当整个字符串是另一个字符串的一部分时,它才匹配,但是它用"3QLAR"满足您的示例。要找到x的任何3个字母的子序列(在y中,反之亦然),则复杂度要高一个数量级,并且需要更多的思考。

因此,这是一种实现上述简化条件的解决方案:

my_function <- function(x, y) {
  helper <- function(x, y) {
    # First convert both strings to lowercase, so match will be case insensitive.
    x <- stringr::str_to_lower(x)
    y <- stringr::str_to_lower(y)

    # Test conditions
    if( substring(x, 1, 3) == substring(y, 1, 3)) return (T)

    if( substring(x, nchar(x)-2, nchar(x)) == substring(y, nchar(y)-2, nchar(y))) return (T)

    if( grepl(x, y) || grepl(y, x) ) return (T)

    return (NA)
  }

  mapply(helper, x, y)
}
© www.soinside.com 2019 - 2024. All rights reserved.