Comment supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121Je 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 ?regexpour 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 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"
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"
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
gsub("^.*_","_","ATGAS_1121_xxx"). Maintenant corrigé.