在 grepl 字符串中使用多个表达式来创建新数据

Use multiple expression in grepl string to create new data

我想根据数据框中另一列中的字符串创建一个新列。使用 case_whengrepl 如果字符串包含 value1value2,我想创建一个新的 class。但是,不确定如何放置此 '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

您可以在此处使用 %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 值,假设它是唯一的其他可能值。

我相信您可以将 | 放入您的 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