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 _.

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


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.


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"

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"

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"

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.