几个带有上下的grepl

问题描述

我有以下 data.frame: data frame

我正在使用 dplyrstringr,我想按以下方式过滤列 Nombre:保留所有包含“regimen”或“promocion”或“ REGIMEN”或“PROMOCION”,即大写和小写。我试过了:

str_view(df$Nombre,regex("regimen|promocion",ignore_case=T))

在这种情况下,它只保留大写和小写的第一个单词(regimen)。如果我删除ignore_case=T,它会同时找到“regimen”和“promocion”,但区分大小写,即只有小写。

当然,这是一个例子,我需要过滤很多词,不仅仅是“regimen”和“promocion”,这就是为什么我不单独过滤每个词。

解决方法

您可以使用 filter 中的 dplyr 以及 greplbase R 中的 (?i) 使模式匹配不区分大小写:

library(dyplr)
df %>%
  filter(grepl("(?i)regimen|promocion",Nombre))
      N       Nombre
1   100      Regimen
2 12345    promocion
3   888 otro regimen

或者,您可以使用相同的模式简单地对数据帧进行子集:

df[grepl("(?i)regimen|promocion",df$Nombre),]

数据:

df <- data.frame(
  N = c(100,12345,666,888),Nombre = c("Regimen","promocion","ley","otro regimen")
)
,

由于数据似乎是西班牙语,我会使用更复杂的正则表达式(也能够捕捉重音)。

library(tidyverse)


df <- data.frame(
  N = c(100,Nombre = c("RÉGIMEN","promoción","otro regimen")
)
df %>%
  filter(str_detect(Nombre,regex("r\\wgimen|promoci\\wn",ignore_case = TRUE)))
#>       N       Nombre
#> 1   100      RÉGIMEN
#> 2 12345    promoción
#> 3   888 otro regimen