【问题标题】:how to make str_detect case insensitive within case_when in r如何在 r 中的 case_when 中使 str_detect 不区分大小写
【发布时间】:2020-04-12 05:40:15
【问题描述】:

我有一个如下的数据框:

dfm = data.frame (names = c('email', 'Facebook', 'walmart', 'target', 'instagram', 'costco'))

我需要创建一个新列source。当名称是 facebook、instagram 或电子邮件时,来源是媒体。当名称为 costco、walmart 或 target 时,来源为 store。

我使用case_whenstr_detect。我需要str_detect 不区分大小写。所以下面是我的代码。

dfm %>% 
  mutate(source = case_when( str_detect(names, fixed('email|facebook|instagram', ignore_case = T))~'media',
                             str_detect(names, 'walmart|costco|target')~ 'store'))

我明白了:

names       source
email       NA          
Facebook    NA          
walmart     store           
target      store           
instagram   NA          
costco      store

我不明白为什么它不起作用。有谁知道为什么?

我尝试了下面的代码,它返回TRUE

str_detect('Facebook', fixed('facebook', ignore_case = T))

【问题讨论】:

    标签: r dplyr stringr


    【解决方案1】:

    也可以尝试正则表达式而不是固定:

    dfm %>% 
      mutate(source = case_when( str_detect(names, regex('email|facebook|instagram', ignore_case = T))~'media',
                                 str_detect(names, 'walmart|costco|target')~ 'store'))
    

    【讨论】:

      【解决方案2】:

      当您使用fixed 时,它不会将| 识别为正则表达式。如果您想进行完全匹配,请使用单词边界,即\\b

      library(dplyr)
      library(stringr)
      
      dfm %>% 
         mutate(source = case_when(str_detect(names, 
                       regex('\\bemail\\b|\\bfacebook\\b|\\binstagram\\b', 
                              ignore_case = TRUE))~'media',
                        str_detect(names, 'walmart|costco|target')~ 'store'))
      
      #      names source
      #1     email  media
      #2  Facebook  media
      #3   walmart  store
      #4    target  store
      #5 instagram  media
      #6    costco  store
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 2020-04-08
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多