Comment supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121
Je veux tout supprimer avant _
.
90
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
gsub("^.*_","_","ATGAS_1121_xxx")
. Maintenant corrigé.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.
la source
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"
la source
Voici la
strsplit
solution sis
est un vecteur:> s <- c("TGAS_1121", "MGAS_1432") > s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2])) > s1 [1] "1121" "1432"
la source
Peut-être que la solution la plus intuitive est probablement d'utiliser la
stringr
fonctionstr_remove
qui est encore plus facile questr_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"
la source
Voici la
strsplit
solution pour un dataframe utilisantdplyr
packagecol1 = 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
la source