Remplacer des caractères spécifiques dans les chaînes

262

Je voudrais supprimer des caractères spécifiques des chaînes d'un vecteur, similaire à la fonction Rechercher et remplacer dans Excel.

Voici les données avec lesquelles je commence:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Je commence par juste la première colonne; Je veux produire la deuxième colonne en supprimant les e:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947
Luc
la source

Réponses:

399

Avec une expression régulière et la fonction gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Ce gsubqui est ici, c'est de remplacer chaque occurrence de "e"par une chaîne vide "".


Voir ?regexpou gsubpour plus d'aide.

Andrie
la source
15
fixed = TRUErendrait cela plus rapide.
Rich Scriven
4
@RichScriven pourriez-vous expliquer brièvement pourquoi?
glaed
6
fixed=TRUEempêche R d'utiliser des expressions régulières, ce qui permet une correspondance de modèle plus flexible mais prend du temps à calculer. Si tout ce qui est nécessaire est de supprimer une seule chaîne constante "e", elles ne sont pas nécessaires.
mm689
Tiendrait sub("e", "", group)le même résultat?
Matheus Santana
remplacerait simplement le premier equ'il trouve dans chaque élément
sindri_baldur
47

Les expressions régulières sont vos amis:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Utilisez maintenant gsub()avec le modèle de remplacement le plus simple possible: chaîne vide:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 
Dirk Eddelbuettel
la source
3
Aussi ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa
26
Eh bien, je pourrais ricaner que "ceux qui ne comprennent pas les fonctions de base sont condamnés à les remplacer". Que gagne exactement stringr ici, en plus d'augmenter le nombre de soulignements dans votre fichier source?
Dirk Eddelbuettel
8
" stringr est un ensemble de wrappers simples qui rendent les fonctions de chaîne de R plus cohérentes, plus simples et plus faciles à utiliser " de l'auteur du package. Donc, si ce que vous dites est vrai (beaucoup de soulignements pour envelopper les fonctions de base ...) il n'y a aucune raison pour que ce paquet existe (avertissement: j'utilise principalement les fonctions d'expression de base mais je sais qu'elles peuvent être difficiles pour les nouveaux utilisateurs ... )
dickoa
17
@dickoa: str_replaceenveloppements sub, donc il ne remplacera la première occurrence du motif. Vous auriez besoin d'utiliser str_replace_allsi vous vouliez le même comportement que gsub.
Joshua Ulrich
24

Résumant 2 façons de remplacer les chaînes:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Utiliser gsub

group$group.no.e <- gsub("e", "", group$group)

2) Utilisez le stringrpackage

group$group.no.e <- str_replace_all(group$group, "e", "")

Les deux produiront la sortie désirée:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947
Megatron
la source
3
À l'époque, vous deviez lire la page entière, y compris les commentaires, pour apprendre la syntaxe de stringr, ma méthode préférée, car elle était principalement discutée dans les commentaires. Cette solution présente rapidement les deux options, c'est pourquoi je l'ai proposée. Mon espoir était d'aider les autres utilisateurs à filtrer un peu comme je devais le faire lorsque j'étais nouveau chez R. J'ai eu du mal avec gsub avant de trouver stringr car il n'était pas mentionné dans une réponse très appréciée. Encore une fois, l'objectif n'est pas de collecter des votes positifs, mais d'essayer d'aider les nouveaux utilisateurs de R.
Megatron
Si vous trouvez des informations dans d'autres réponses / commentaires que vous trouvez utiles et que vous souhaitez convertir en réponse, vous pouvez au moins fournir une attribution pour montrer d'où avez-vous obtenu les informations / faire de la réponse un Wiki Comminuty au lieu de simplement la faire comme le tien.
David Arenburg
Merci - gardera à l'esprit pour la prochaine fois. Je n'ai jamais créé de wiki communautaire auparavant, je ne savais donc pas que c'était une option.
Megatron
1
L'option 2 fonctionne très bien lorsqu'elle est appliquée à une colonne de données dans un bloc de données, sans spécifier toutes les valeurs de la colonne. Évidemment, l'option 1 est une répétition, mais l'option 2 fonctionne très bien et mérite un vote positif pour la fonctionnalité ajoutée.
Phil_T
6

Vous n'avez pas besoin de créer un bloc de données à partir du vecteur de chaînes, si vous souhaitez y remplacer certains caractères. Les expressions régulières sont un bon choix car elles ont déjà été mentionnées par @Andrie et @Dirk Eddelbuettel.

Faites attention, si vous souhaitez remplacer des caractères spéciaux, comme des points, vous devez utiliser la syntaxe d'expression régulière complète, comme indiqué dans l'exemple ci-dessous:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

cela produira

[1] "Czech Republic" "New Zealand"    "Great Britain" 
Alexandre
la source
Vous pouvez simplement leur échapper, mais vous devez également échapper au personnage d'échappement, car il est entre guillemets:gsub("\\.", " ", ctr_names)
Kamil S Jaron
4

Utilisez le package stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"
MERose
la source
0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Anya Sti
la source