在R中关闭大小写敏感性

29

我在处理大小写时遇到了困难。我们能将它关闭吗?

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

2个回答

33

无法关闭 == 的大小写敏感性,但将两个字符向量强制转换为大写,然后测试是否相等,实际上是同样的操作:

toupper(A1)
[1] "A" "A" "A" "A" "A" "A" "A"

toupper(A1)==toupper(B1)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

32

正如Josh O'Brien所说的那样,要在R中进行不区分大小写的匹配,实际上可以使用正则表达式(使用例如grepgrepl

在这种情况下,如果您要匹配单个字符,可以像这样使用mapplygrepl

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

1
+1 这是一个有趣且信息量丰富的补充。如果你想使用 grepl 并且不接受子字符串匹配,我想你可以这样做:mapply(grepl,A1,C1,ignore.case=TRUE) & mapply(grepl,C1, A1,ignore.case=TRUE) - Josh O'Brien
@JoshO'Brien:你确实可以这样做,但是这种结构很难在效率上表现出色...;-) - Joris Meys
是的。而且在任何相反的代码高尔夫(code golf)中,它都是一个有竞争力的选手! - Josh O'Brien
我在这种情况下几乎总是使用grepl进行比较,它更易于阅读、操作和理解。不过速度比==要慢 :/ - Hansi
1
一个轻微的替代方法可能是:mapply(grepl, tolower(A1), tolower(B1), fixed = TRUE) - Tony Breyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接