web-dev-qa-db-fra.com

extraire une sous-chaîne en R selon un motif

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!

94
alittleboy

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")
161
G. Grothendieck

Par exemple, en utilisant gsub ou sub

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"
20
agstudy

Voici une autre réponse simple

gsub("^.*:","", string)
9
Ragy Isaac

Cela devrait faire:

gsub("[A-Z][1-9]:", "", string)

donne

[1] "E001" "E002" "E003"
4
user1981275

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"
3
CSJCampbell

Si vous utilisez data.table, alors tstrsplit() est un choix naturel:

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
0
sindri_baldur