web-dev-qa-db-ja.com

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である必要があります

25
jon

==の大文字と小文字の区別をオフにする方法はありませんが、両方の文字ベクトルを大文字に変換し、thenをテストすると、等しいかどうかは同じになります。

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

ジョシュ・オブライエンが言ったように。 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
25
Joris Meys