ti-enxame.com

desativando a distinção entre maiúsculas e minúsculas em r

Estou tendo dificuldades com a distinção entre maiúsculas e minúsculas. Podemos desligá-lo?

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

deve ser tudo TRUE

25
jon

Não há como desativar a distinção entre maiúsculas e minúsculas de ==, mas forçar os dois vetores de caracteres para maiúsculas e então testar a igualdade equivale à mesma coisa:

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

toupper(A1)==toupper(B1)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
30
Josh O'Brien

Como Josh O'Brien disse. Para estender um pouco a correspondência sem caixa em R, isso é realmente possível com expressões regulares (usando, por exemplo, grep e grepl)

Nesse caso, você pode usar mapply e grepl assim, desde que esteja combinando caracteres únicos:

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 

Você precisa ter cuidado, pois também combina seqüências parciais como esta:

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  

Isso pode ou não ser o que você deseja.

Em uma nota lateral, se você combinar com expressões regulares e desejar ignorar o caso, também poderá usar a construção (?i) para ativar a correspondência sem caixa e (?-i) para desativar a correspondência sem caixa:

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
25
Joris Meys