web-dev-qa-db-fra.com

Utiliser grep pour aider à sous-définir un cadre de données dans R

Je n'arrive pas à mettre mes données en place. Je veux que les données soient définies dans la colonne x, où les trois premiers caractères commencent par G45.

Mon cadre de données:

 x <- c("G448", "G459", "G479", "G406")  
 y <- c(1:4)
 My.Data <- data.frame (x,y)

J'ai essayé:

 subset (My.Data, x=="G45*")

Mais je ne sais pas comment utiliser des caractères génériques. J'ai aussi essayé grep () pour trouver les indications:

 grep  ("G45*", My.Data$x)

mais il renvoie les 4 lignes plutôt que seulement celles commençant par G45, probablement aussi, car je ne sais pas comment utiliser les caractères génériques.

29
Stewart Wiseman

C'est assez simple d'utiliser [ pour extraire:

grep vous indiquera la position dans laquelle il correspond à votre modèle de recherche (sauf si vous utilisez value = TRUE). 

grep("^G45", My.Data$x)
# [1] 2

Puisque vous effectuez une recherche dans les valeurs d'une seule colonne, cela correspond en fait à l'index de la ligne. Utilisez donc ceci avec [ (où vous utiliseriez My.Data[rows, cols] pour obtenir des lignes et des colonnes spécifiques).

My.Data[grep("^G45", My.Data$x), ]
#      x y
# 2 G459 2

La page d'aide pour subset montre comment vous pouvez utiliser grep et grepl avec subset si vous préférez utiliser cette fonction plutôt que [. Voici un exemple.

subset(My.Data, grepl("^G45", My.Data$x))
#      x y
# 2 G459 2

Depuis R 3.3, il y a maintenant aussi la fonction startsWith, que vous pouvez à nouveau utiliser avec subset (ou avec l’une des approches ci-dessus). Selon la page d’aide de la fonction, c’est beaucoup plus rapide que d’utiliser substring ou grepl.

subset(My.Data, startsWith(as.character(x), "G45"))
#      x y
# 2 G459 2
50

Vous pouvez également utiliser le package stringr

library(dplyr)
library(stringr)
My.Data %>% filter(str_detect(x, '^G45'))

Vous ne pouvez pas utiliser '^' (commence par) dans ce cas, pour obtenir les résultats dont vous avez besoin

0
Ayan