Comment supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121
Je veux tout supprimer avant _
.
Réponses:
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 ?regex
pour plus de détails et références
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.
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"
Voici la strsplit
solution 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"
Peut-être que la solution la plus intuitive est probablement d'utiliser la stringr
fonction str_remove
qui est encore plus facile que str_replace
car 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"
Voici la strsplit
solution pour un dataframe utilisant dplyr
package
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
gsub("^.*_","_","ATGAS_1121_xxx")
. Maintenant corrigé.