Supprimer une partie d'une chaîne

90

Comment supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121Je veux tout supprimer avant _.

Lisann
la source

Réponses:

131

Utilisez des expressions régulières. Dans ce cas, vous pouvez utiliser gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Cette expression régulière correspond au début de la chaîne (^), à tout caractère (.) Répété zéro ou plusieurs fois (*) et un trait de soulignement (_). Le ? rend la correspondance "paresseuse" pour que seules les correspondances soient loin du premier trait de soulignement. Cette correspondance est remplacée par un simple trait de soulignement. Voir ?regexpour plus de détails et références

Joshua Ulrich
la source
6
L'expression régulière précédente correspondrait au dernier trait de soulignement dans le cas, par exemple, de gsub("^.*_","_","ATGAS_1121_xxx"). Maintenant corrigé.
Richie Cotton
7
@Joshua Je trouve très utile que vous expliquiez le rôle des expressions régulières.
Vasile
Cela fonctionne également avec un vecteur de chaînes comme dernier argument. R est génial comme ça.
naught101
37

Vous pouvez utiliser un élément intégré pour cela, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit renvoie les deux parties de la chaîne analysée sur le paramètre de fractionnement sous forme de liste . C'est probablement pas ce que vous voulez, alors envelopper l'appel à unlist , alors index ce tableau de sorte que seul le second des deux éléments dans le vecteur sont renvoyés.

Enfin, le paramètre fixe doit être défini sur TRUE pour indiquer que le paramètre de fractionnement n'est pas une expression régulière, mais un caractère correspondant littéral.

doug
la source
23

Si vous êtes un type de personne Tidyverse, voici la solution stringr :

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
rien101
la source
21

Voici la strsplitsolution si sest un vecteur:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
verbamour
la source
2
Très utile, merci! FYI pour obtenir la première partie de la chaîne (c'est-à-dire avant le '_'), remplacez le [2] à la fin par un [1].
stevenjoe
4

Peut-être que la solution la plus intuitive est probablement d'utiliser la stringrfonction str_removequi est encore plus facile que str_replacecar elle n'a qu'un seul argument au lieu de 2.

La seule partie délicate de votre exemple est que vous souhaitez conserver le trait de soulignement, mais c'est possible: vous devez faire correspondre l'expression régulière jusqu'à ce qu'elle trouve le modèle de chaîne spécifié (?=pattern).

Voir exemple:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"
Haricot agile
la source
3

Voici la strsplitsolution pour un dataframe utilisant dplyrpackage

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
KK_63
la source