我已经搜索并找到了类似的答案,但并不是我所需要的。
我想用2个字符串标识匹配项,而忽略大小写和空格以及特殊字符。
list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')
下面的所有内容应提供相同的输出(1 2 3)
match(list1, list1)
match(list1, list2)
match(list1, list3)
我已经尝试过str_detect(list1, regex(list2, ignore_case = TRUE))
,但是并没有提供相同类型的输出(而且我也不知道如何在其中合并特殊字符/空格。
答案 0 :(得分:2)
您可以创建一个正则表达式,使用gsub
仅拉出字符串中间的字母,然后将其转换为小写字母。然后,您可以在结果上使用标准match
。最好将所有这些放到自己的函数中:
list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')
match2 <- function(a, b)
{
a <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", a))
b <- tolower(gsub("(.*)([[:alpha:]]+)(.*)", "\\2", b))
match(a, b)
}
match2(list1, list1)
#> [1] 1 2 3
match2(list1, list2)
#> [1] 1 2 3
match2(list1, list3)
#> [1] 1 2 3
由reprex package(v0.3.0)于2020-02-21创建
答案 1 :(得分:2)
看到@Allan Cameron就在我之前发布了一个非常相似的解决方案...无论如何都要离开,因为有足够的不同..?!
list1 <- c('a', 'b', 'c')
list2 <- c('A', 'B', 'C')
list3 <- c('a-', 'B_', '- c')
正则表达式可将任何不是字母字符的符号替换为空字符串:
f <- function(x) {
return(tolower(gsub("[^[:alpha:]]", "", x)))
}
match(f(list1), f(list2))
match(f(list1), f(list3))
match(f(list2), f(list3))