отключение чувствительности к регистру в r - PullRequest
25 голосов
/ 02 декабря 2011

У меня проблемы с чувствительностью к регистру.Можем ли мы выключить его?

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 ]

29 голосов
/ 02 декабря 2011

Нет способа отключить чувствительность к регистру ==, но приведение обоих векторов символов к верхнему регистру и , а затем проверка на равенство равносильно одному и тому же:

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

toupper(A1)==toupper(B1)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24 голосов
/ 03 декабря 2011

Как сказал Джош О'Брайен.Чтобы немного расширить сопоставление без регистра в 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  

Это может или не может быть тем, что выwant.

Если вы используете совпадение с регулярными выражениями и хотите игнорировать регистр, вы также можете использовать конструкцию (?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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...