web-dev-qa-db-fra.com

Supprimer une partie d'une chaîne

Comment puis-je supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121 je veux tout supprimer avant _.

78
Lisann

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 (^), à n’importe quel caractère (.) Répété zéro ou plusieurs fois (*) et au trait de soulignement (_). Le ? rend le match "paresseux" pour qu'il ne corresponde qu'au premier trait de soulignement. Ce match est remplacé par juste un trait de soulignement. Voir ?regex pour plus de détails et de références

112
Joshua Ulrich

Vous pouvez utiliser une fonction intégrée pour cela, () strsplit :

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

strsplit renvoie les deux morceaux de la chaîne analysée sur le divise le paramètre en tant que liste . Ce n'est probablement pas ce que vous voulez, alors insérez votre appel dans unlist , puis index ce tableau de sorte que seul le deuxième des deux éléments du vecteur soit renvoyé.

Enfin, le paramètre fixed doit être défini sur TRUE pour indiquer que le paramètre split n'est pas une expression régulière, mais un caractère de correspondance littérale.

32
doug

Voici la solution strsplit si s est un vecteur:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
20
verbamour

Si vous êtes du genre 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"
17
naught101

Voici la solution strsplit pour un cadre de données utilisant le package dplyr

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
3
KK_63

La solution la plus intuitive est probablement d’utiliser la fonction stringr _str_replace_.

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 %>% str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"
_
0
Agile Bean