2011-12-02 56 views
21

我遇到大小写敏感问题。我们可以关闭它吗?r关闭大小写敏感度

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

回答

29

有没有办法关闭的==区分大小写,但强迫两个特征向量为大写和然后测试平等达同样的事情:

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

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

正如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'和_not_ accept substring匹配,我想你可以做'mapply(grepl,A1,C1,ignore.case = TRUE)&mapply(grepl,C1,A1,ignore.case = TRUE)' 。 –

+0

@ JoshO'Brien:你的确可以,但是这个构造不太可能在效率上超越...... ;-) –

+0

是的。而在高尔夫的代码相反,它是一个竞争者! –