Comment puis-je supprimer une partie d'une chaîne? Par exemple, dans ATGAS_1121
je veux tout supprimer avant _
.
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
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.
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"
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"
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
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"
_