Voici quelques moyens:
1) sous
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2) strsplit
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3) lire le tableau
read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"
4) sous-chaîne
Cela suppose que la deuxième partie commence toujours au 4e caractère (ce qui est le cas dans l'exemple de la question):
substring(string, 4)
## [1] "E001" "E002" "E003"
4a) sous-chaîne / regex
Si les deux points n'étaient pas toujours dans une position connue, nous pourrions modifier (4) en le recherchant:
substring(string, regexpr(":", string) + 1)
5) strapplyc
strapplyc
renvoie la partie entre parenthèses:
library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"
6) read.dcf
Celui-ci ne fonctionne que si les sous-chaînes précédant les deux points sont uniques (ce qu'elles sont dans l'exemple de la question). Il faut aussi que le séparateur soit deux points (ce qui est dans la question). Si un séparateur différent était utilisé, nous pourrions l'utiliser sub
pour le remplacer d'abord par deux points. Par exemple, si le séparateur était _
alorsstring <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
7) séparé
7a) En utilisant tidyr::separate
nous créons un bloc de données avec deux colonnes, une pour la partie avant les deux points et une pour après, puis extrayons cette dernière.
library(dplyr)
library(tidyr)
library(purrr)
DF <- data.frame(string)
DF %>%
separate(string, into = c("pre", "post")) %>%
pull("post")
## [1] "E001" "E002" "E003"
7b) Alternativement separate
peut être utilisé pour simplement créer lepost
colonne, puis unlist
et unname
la trame de données résultant:
library(dplyr)
library(tidyr)
DF %>%
separate(string, into = c(NA, "post")) %>%
unlist %>%
unname
## [1] "E001" "E002" "E003"
8) Trimws Nous pouvons utiliser trimws
pour couper les caractères des mots sur la gauche, puis l'utiliser à nouveau pour couper les deux points.
trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"
Remarque
L'entrée string
est supposée être:
string <- c("G1:E001", "G2:E002", "G3:E003")
_
comme séparateur et créé deux variables distinctes pour le préfixe et le suffixe en fonction de la réponse @Grothendieck:prefix <- sub("_.*", "", variable)
etsuffix <- sub(".*_", "", variable)
Par exemple en utilisant
gsub
ousub
la source
Voici une autre réponse simple
la source
Tard dans la fête, mais pour la postérité, le paquet stringr (qui fait partie de la populaire suite de paquets "tidyverse") fournit désormais des fonctions avec des signatures harmonisées pour la gestion des chaînes:
la source
Cela devrait faire:
donne
la source
Si vous utilisez
data.table
alorststrsplit()
est un choix naturel:la source
Le package unglue fournit une alternative, aucune connaissance des expressions régulières n'est requise pour les cas simples, ici nous ferions:
Créé le 06/11/2019 par le package reprex (v0.3.0)
Plus d'infos: https://github.com/moodymudskipper/unglue/blob/master/README.md
la source