Supposons que j'ai une liste de chaîne: string = c("G1:E001", "G2:E002", "G3:E003")
. J'espère maintenant obtenir un vecteur de chaîne ne contenant que les parties après le deux-points ":", c'est-à-dire substring = c(E001,E002,E003)
. Y at-il un moyen pratique dans R de faire cela? Utiliser substr
? Merci!
Voici quelques façons:
1) sous
sub(".*:", "", string)
## [1] "E001" "E002" "E003"
2) strsplit
sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"
3) read.table
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 par le 4ème caractère (ce qui est le cas dans l'exemple de la question):
substring(string, 4)
## [1] "E001" "E002" "E003"
4a) substring/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 antérieures aux deux points sont uniques (comme dans l'exemple de la question). De plus, le séparateur doit être un colon (ce qui est dans la question). Si un séparateur différent était utilisé, nous pourrions utiliser sub
pour le remplacer par un deux-points en premier. Par exemple, si le séparateur était _
, alors string <- sub("_", ":", string)
c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"
AJOUTÉE. strapplyc
et read.dcf
solutions.
REMARQUE.
L'entrée string
est supposée être:
string <- c("G1:E001", "G2:E002", "G3:E003")
Par exemple, en utilisant gsub
ou sub
gsub('.*:(.*)','\\1',string)
1] "E001" "E002" "E003"
Voici une autre réponse simple
gsub("^.*:","", string)
Cela devrait faire:
gsub("[A-Z][1-9]:", "", string)
donne
[1] "E001" "E002" "E003"
Tard dans la soirée, 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 le traitement des chaînes:
string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
Si vous utilisez data.table
, alors tstrsplit()
est un choix naturel:
tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"