【问题标题】:turning off case sensitivity in r在 r 中关闭区分大小写
【发布时间】:2011-12-02 19:33:56
【问题描述】:

我在区分大小写方面遇到困难。我们可以关掉它吗?

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

【问题讨论】:

    标签: r case-sensitive


    【解决方案1】:

    没有办法关闭== 的大小写敏感性,但是将两个字符向量强制为大写和然后测试相等性等同于:

    toupper(A1)
    [1] "A" "A" "A" "A" "A" "A" "A"
    
    toupper(A1)==toupper(B1)
    # [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    

    【讨论】:

      【解决方案2】:

      正如乔什·奥布莱恩所说。为了扩展 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 这是一个有趣且内容丰富的补充。如果您想使用 grepl 并且 not 接受子字符串匹配,我想您可以使用 mapply(grepl,A1,C1,ignore.case=TRUE) &amp; mapply(grepl,C1, A1,ignore.case=TRUE)
      • @JoshO'Brien :确实可以,但这种结构不太可能在效率方面表现出色...... ;-)
      • 是的。无论代码高尔夫的反面是什么,它都是竞争者!
      • 我几乎总是将这类事情与 grepl 进行比较,这样更容易阅读、操作和理解。虽然比 == 慢:/
      • 一个轻微的选择可能是:mapply(grepl, tolower(A1), tolower(B1), fixed = TRUE)
      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多