我有
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个连续的匹配字母)。无论是否使用大写字母,我还需要该函数进行匹配。
[如果有人熟悉该方法,请提供帮助。谢谢。
我认为可以用三种不同的逻辑条件来解决问题:
我知道条件(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)
}