5 votes

Y a-t-il une fonction R pour remplacer un RegEx correspondant par une chaîne de caractères de même longueur ?

Je possède un vecteur

test <- c("NNNCTCGTNNNGTCGTNN", "NNNNNCGTNNNGTCGTGN")

et je veux remplacer tous les N au début de tous les éléments en utilisant la même longueur "-". Lorsque j'utilise la fonction gsub ne remplace qu'avec un "-".

gsub("^N+", "-", test)
# [1] "-CTCGTNNNGTCGTNN" "-CGTNNNGTCGTGN"  

Mais je veux que le résultat ressemble à ceci

# "---CTCGTNNNGTCGTNN", "-----CGTNNNGTCGTGN"

Y a-t-il une fonction R qui peut faire cela? Merci pour votre patience et vos conseils.

4voto

Cary Swoveland Points 6784

Vous pouvez écrire :

test <- c("NNNCTCGTNNNGTCGTNN", "NNNNNCGTNNNGTCGTGN", "XNNNNNCGTNNNGTCGTGN")

gsub("\\GN", "-", perl=TRUE, test)

ce qui retourne :

"---CTCGTNNNGTCGTNN"  "-----CGTNNNGTCGTGN"  "XNNNNNCGTNNNGTCGTGN"

regex | code R

\G, qui est supporté par Perl (et par PCRE (PHP), Ruby, le moteur regex PyPI de Python et d'autres), affirme que la position actuelle est au début de la chaîne pour le premier match et à la fin du match précédent par la suite.

Si la chaîne était "NNNCTCGTNNNGTCGTNN", les trois premiers "N" seraient chacun correspondus (et remplacés par un tiret par gsub), puis la tentative de correspondre à "C" échouerait, terminant le match et le remplacement de la chaîne.

1voto

Tim Biegeleisen Points 53335

Une approche serait d'utiliser les fonctions stringr, qui prennent en charge les rappels regex:

test <- c("NNNCTCGTNNNGTCGTNN", "NNNNNCGTNNNGTCGTGN")
repl <- function(x) { gsub("N", "-", x) }
str_replace_all(test, "^N+", function(m) repl(m))

[1] "---CTCGTNNNGTCGTNN" "-----CGTNNNGTCGTGN"

La stratégie ici est d'abord de faire correspondre ^N+ pour capturer un ou plusieurs N en tête. Ensuite, nous passons cette correspondance à une fonction de rappel qui remplace chaque N par un tiret.

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