2011-12-02 16 views

risposta

29

non c'è modo per disattivare caso sensibilità del ==, ma costringere entrambi i vettori di caratteri in maiuscolo e poi test per l'uguaglianza che è lo stessa cosa:

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

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

Come ha detto Josh O'Brien. Per estendere un po 'sul bossolo di corrispondenza in R, che in realtà è possibile con le espressioni regolari (utilizzando ad esempio grep e grepl)

In questo caso è possibile utilizzare mapply e grepl come questo, a condizione che stai corrispondenza singoli caratteri:

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 

bisogna essere attenti, però, perché corrisponde anche stringhe parziali come questo:

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 

questo può o non può essere quello che vuoi.

Su un sidenote, se abbinate con le espressioni regolari e si vuole ignorare il caso, è anche possibile utilizzare il costrutto (?i) per accendere corrispondenza senza bossolo e (?-i) per disattivare senza bossolo matching:

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 Questa è un'aggiunta divertente e informativa. Se si desidera utilizzare 'grepl' e _non_ accettare le corrispondenze di sottostringa, suppongo che si possa fare' mapply (grepl, A1, C1, ignore.case = TRUE) e mapply (grepl, C1, A1, ignore.case = TRUE) ' . –

+0

@ JoshO'Brien: Potresti davvero, ma è improbabile che quel costrutto eccella in efficienza ... ;-) –

+0

Sì. E a prescindere dal codice del golf, è un contendente! –

Problemi correlati