328 votes

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

J'aimerais supprimer des caractères spécifiques des chaînes de caractères dans un vecteur, de manière 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 avec seulement la première colonne ; je veux produire la deuxième colonne en enlevant le e 's :

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

480voto

Andrie Points 66979

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"

Quoi gsub "e" avec une chaîne vide "" .


Ver ?regexp ou gsub pour plus d'aide.

22 votes

fixed = TRUE rendrait cela plus rapide.

4 votes

@RichScriven pouvez-vous nous expliquer brièvement pourquoi ?

10 votes

fixed=TRUE empêche R d'utiliser les expressions régulières, qui permettent une correspondance plus souple des motifs mais prennent 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.

55voto

Dirk Eddelbuettel Points 134700

Les expressions régulières sont vos amies :

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

Maintenant, utilisez 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>

3 votes

Aussi... require(stringr);group$groupNoE <- str_replace(group$group, "e", "")

28 votes

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, à part augmenter le nombre de tirets bas dans votre fichier source ?

8 votes

" stringr est un ensemble d'enveloppes simples qui rendent les fonctions de chaînes de caractères de R plus cohérentes, plus simples et plus faciles à utiliser. "de l'auteur du paquet. 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 (disclaimer : j'utilise principalement les fonctions regex de base mais je sais qu'elles peuvent être difficiles pour les nouveaux utilisateurs...).

37voto

Megatron Points 107

Résumé de 2 façons de remplacer les cordes :

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

1) Utiliser gsub

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

2) Utilisez le stringr paquet

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

Les deux produiront le résultat souhaité :

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

22voto

Alexander Points 925

Il n'est pas nécessaire de créer un cadre de données à partir d'un vecteur de chaînes de caractères, si vous souhaitez remplacer certains caractères. Les expressions régulières sont un bon choix pour cela, comme cela a déjà été mentionné par @Andrie et @Dirk Eddelbuettel.

Attention, si vous souhaitez remplacer des caractères spéciaux, comme les points, vous devez utiliser la syntaxe complète des expressions régulières, comme le montre 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"

6voto

MERose Points 1634

Utilisez le stringi paquet :

require(stringi)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X