2016-06-27 1 views
-1

En génomique, nous devons souvent travailler avec de nombreuses chaînes de noms de gènes séparés par des points-virgules. Je veux faire une correspondance de motif (trouver un nom de gène spécifique dans une chaîne), puis supprimer cela de la chaîne. J'ai également besoin d'enlever tout point-virgule avant ou après le nom du gène. Cet exemple de jouet illustre le problème.Supprimer le motif dans la chaîne et le point-virgule avant et/ou après (R)

s <- c("a;b;x", "a;x;b", "x;b", "x") 
library(stringr) 
str_replace(s, "x", "") 
#[1] "a;b;" "a;;b" ";b" "" 

La sortie souhaitée doit être.

#[1] "a;b" "a;b" "b" "" 

que je pouvais faire pour ltrage ;x et x; aussi bien et qui me donnerait la sortie; mais ce ne serait pas très efficace. Nous pouvons également utiliser gsub ou le paquet stringi et ce serait bien aussi.

Répondre

3

Supprimer x et en option ; après si x est le caractère de la chaîne autrement supprimer x et en option ; avant qu'il qui devrait couvrir tous les cas comme énuméré:

str_replace(s, "^x(;?)|(;?)x", "") 
# [1] "a;b" "a;b" "b" ""  
+0

Merci. Mais le premier élément a encore un extra; à la fin. "un B;" devrait être "a; b". – milan

+0

Oh. Oui c'est vrai. Juste mis à jour la réponse. – Psidom

1

Nous pouvons utiliser gsub de base R

gsub("^x;|;?x", "", s) 
#[1] "a;b" "a;b" "b" ""