【问题标题】:Use multiple expression in grepl string to create new data在 grepl 字符串中使用多个表达式来创建新数据
【发布时间】:2024-01-09 22:20:01
【问题描述】:

我想根据数据框中另一列中的字符串创建一个新列。使用case_whengrepl 如果字符串包含value1value2,我想创建一个新类。但是,不知道怎么写这个“OR”语句?

虚拟示例(不工作):

df <- data.frame(type = "a_m5", "a_m20", "a_5")

df %>% 
  mutate(modif = case_when(
    grepl('_m5'|'_m20', type) ~ 'less', # how to specify here | OR symbol in R? 
    grepl('_5', type) ~ 'more'))

当然,如果我一一指定语句(工作),它会起作用:

df %>% 
  mutate(modif = case_when(
    grepl('_m5', type) ~ 'less',
    grepl('_m20', type) ~ 'less',
    grepl('_5', type) ~ 'more'))

但我想知道如何使它成为一条线,因为我有多种选择?也许像chars %in% vector 这样的东西可以在这里工作?

期望的输出:

   type modif
1  a_m5  less
2 a_m20  less
3   a_5  more

【问题讨论】:

    标签: r dplyr case-when grepl


    【解决方案1】:

    您可以在这里使用%in%

    df %>% 
        mutate(modif = case_when(
            type %in% c('_m5', '_m20') ~ 'less',
            TRUE ~ 'more')
        )
    

    您还可以在 LHS 上为每个谓词保留一个值,以保持一致:

    df %>% 
        mutate(modif = case_when(
            '_m5' ~ 'less',
            '_m20' ~ 'less',
            TRUE ~ 'more')
        )
    

    请注意,我不会明确检查 _5 值,假设它是唯一可能的值。

    【讨论】:

      【解决方案2】:

      我相信您可以将| 放入您的 grepl 正则表达式中:

      df <- data.frame(type = c("a_m5", "a_m20", "a_5"))
      
      df %>% 
        mutate(modif = case_when(
          grepl('_m5|_m20', type) ~ 'less',
          grepl('_5', type) ~ 'more'))
      
         type modif
      1  a_m5  less
      2 a_m20  less
      3   a_5  more
      
      

      【讨论】:

        最近更新 更多