web-dev-qa-db-fra.com

Expressions régulières (RegEx) et dplyr :: filter ()

J'ai une trame de données simple qui ressemble à ceci:

x <- c("aa", "aa", "aa", "bb", "cc", "cc", "cc")
y <- c(101, 102, 113, 201, 202, 344, 407)
df = data.frame(x, y)    

    x   y
1   aa  101
2   aa  102
3   aa  113
4   bb  201
5   cc  202
6   cc  344
7   cc  407

Je voudrais utiliser un dplyr :: filter () et un RegEx pour filtrer toutes les observations y qui commencent par le nombre 1

J'imagine que le code ressemblera à quelque chose comme ceci:

df %>%
  filter(y != grep("^1")) 

Mais je reçois une Error in grep("^1") : argument "x" is missing, with no default

22
emehex

Vous devez vérifier les documentations pour grepl et filter.

Pour grep/grepl, vous devez également fournir le vecteur que vous souhaitez archiver (y dans ce cas) et filter prend un vecteur logique (c'est-à-dire que vous devez utiliser grepl). Si vous souhaitez fournir un vecteur d'index (à partir de grep), vous pouvez utiliser slice à la place.

df %>% filter(!grepl("^1", y))

Ou avec un index dérivé de grep:

df %>% slice(grep("^1", y, invert = TRUE))

Mais vous pouvez aussi simplement utiliser substr car vous n'êtes intéressé que par le premier caractère:

df %>% filter(substr(y, 1, 1) != 1)
40
talat

Avec une combinaison de dplyret stringr (pour rester dans le sens inverse), vous pourriez faire:

df %>% filter(!str_detect(y, "^1"))

Cela fonctionne parce que str_detect renvoie un vecteur logique.

14
Omar