我在处理大小写时遇到了困难。我们能将它关闭吗?
A1 <- c("a", "A", "a", "a", "A", "A", "a")
B1 <- c(rep("a", length(A1)))
A1 == B1
# [1] TRUE FALSE TRUE TRUE FALSE FALSE TRUE
应该全部为TRUE
我在处理大小写时遇到了困难。我们能将它关闭吗?
A1 <- c("a", "A", "a", "a", "A", "A", "a")
B1 <- c(rep("a", length(A1)))
A1 == B1
# [1] TRUE FALSE TRUE TRUE FALSE FALSE TRUE
应该全部为TRUE
无法关闭 ==
的大小写敏感性,但将两个字符向量强制转换为大写,然后测试是否相等,实际上是同样的操作:
toupper(A1)
[1] "A" "A" "A" "A" "A" "A" "A"
toupper(A1)==toupper(B1)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
正如Josh O'Brien所说的那样,要在R中进行不区分大小写的匹配,实际上可以使用正则表达式(使用例如grep
和grepl
)
在这种情况下,如果您要匹配单个字符,可以像这样使用mapply
和grepl
:
A1 <- c("a", "A", "a", "a", "A", "A", "a")
B1 <- c(rep("a", length(A1)))
mapply(grepl,A1,B1,ignore.case=TRUE)
# a A a a A A a
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE
不过你需要小心,因为它也会匹配部分字符串,比如这个:
C1 <- rep('ab',length(A1))
mapply(grepl,A1,C1,ignore.case=TRUE)
# a A a a A A a
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE
这可能是你想要的,也可能不是。
另外,如果你使用正则表达式匹配并且想忽略大小写,你还可以使用构造形式(?i)
来开启不区分大小写匹配,(?-i)
来关闭不区分大小写匹配:
D1 <- c('abc','aBc','Abc','ABc','aBC')
grepl('a(?i)bc',D1) # caseless matching on B and C
# [1] TRUE TRUE FALSE FALSE TRUE
grepl('a(?i)b(?-i)c',D1) # caseless matching only on B
# [1] TRUE TRUE FALSE FALSE FALSE
grepl
并且不接受子字符串匹配,我想你可以这样做:mapply(grepl,A1,C1,ignore.case=TRUE) & mapply(grepl,C1, A1,ignore.case=TRUE)
。 - Josh O'Brien