extraction chaine de caractère

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

extraction chaine de caractère

Messagepar Aline Tavaud » 16 Mar 2021, 13:25

Bonjour,

J'ai besoin d'aide pour extraire une chaine de caractère. J'aimerai pouvoir récupérer le numéro du chromosome indiqué dans la colonne ID (chiffre après la chaine de caractère chr).
Pour cela j'aimerai utiliser la fonction mutate du package dplyr pour créer une nouvelle variable mais j'ai du mal à trouver comment récupérer le chiffre correspondant au chromosome pour créer cette nouvelle variable. Voici un exemple ci dessous de données.

Merci d'avance pour votre aide,

Aline

Code : Tout sélectionner

ID=c("hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752","hg19_ct_UserTrack_xoijugisidu_chr1:1874526","hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526")
index=c(1,2,3)
data.frame(index, ID)


Code : Tout sélectionner

  index                                             ID
1     1  hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752
2     2     hg19_ct_UserTrack_xoijugisidu_chr1:1874526
3     3 hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: extraction chaine de caractère

Messagepar Sébastien Rochette » 16 Mar 2021, 13:32

Vous pouvez utiliser une expression régulière avec le package {stringr}

Code : Tout sélectionner

ID=c("hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752","hg19_ct_UserTrack_xoijugisidu_chr1:1874526","hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526")
index=c(1,2,3)
data <- data.frame(index, ID)

library(dplyr)
library(stringr)

# Extraire des numéros qui sont à la fin de la chaine, et après le signe `:`
data %>%
  mutate(numero = str_extract(ID, pattern = "(?<=:)(\\d+)$"))


Plus d'infos sur les expressions régulières: https://perso.ens-lyon.fr/lise.vaudor/strings-et-expressions-regulieres/
Sébastien
Dev, Consult, Formateur
ThinkR

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: extraction chaine de caractère

Messagepar Logez Maxime » 16 Mar 2021, 13:36

Bonjour,

Il y a toujours pas mal de possibilités différentes avec les expressions régulières.
Les fonctions de base type sub et gsub peuvent aussi faire l'affaire :

Code : Tout sélectionner

tab <- data.frame(index, ID)
sub("^.+:", "", tab$ID)
[1] "44788752"  "1874526"   "187487526"
Cordialement,
Maxime

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: extraction chaine de caractère

Messagepar Aline Tavaud » 16 Mar 2021, 14:02

Bonjour,

Merci pour vos réponses. En fait ce n'est pas exactement ce que je voulais (je me suis surement mal exprimée) car ce que je veux c'est ce qui se trouve entre chr et les : (donc après chr mais avant :) (dans mon exemple c'est 1 à chaque fois). Je ne connais pas encore très bien les expressions régulières, il faut que j'apprenne cela. Quelle est donc la manière d'écrire pour récupérer un ou plusieurs caractère compris entre deux caractères ?

Merci d'avance,

Aline

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: extraction chaine de caractère

Messagepar Mickael Canouil » 16 Mar 2021, 15:00

Bonjour,

Code : Tout sélectionner

df <- data.frame(
  index = c(1, 2, 3),
  ID = c("hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752", "hg19_ct_UserTrack_xoijugisidu_chr1:1874526", "hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526")

La version simple en R base :

Code : Tout sélectionner

df[["chr"]] <- gsub(".*chr([^:]+):.*", "\\1", df[["ID"]]) 
df
#>   index                                             ID chr
#> 1     1  hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752   1
#> 2     2     hg19_ct_UserTrack_xoijugisidu_chr1:1874526   1
#> 3     3 hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526   1    


voici deux versions "light" et complète avec {data.table} :

Code : Tout sélectionner

library(data.table)
setDT(df)[= chr := gsub(".*chr([^:]+):.*", "\\1", ID)][]
#>    index                                             ID chr
#> 1:     1  hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752   1
#> 2:     2     hg19_ct_UserTrack_xoijugisidu_chr1:1874526   1
#> 3:     3 hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526   1

# Extract all fields from ID
setDT(df)[= tstrsplit(ID, "_"), by = "index"][= Chr := gsub("chr([^:]+):.*", "\\1", V5)][]
#>    index   V1 V2        V3            V4             V5 Chr
#> 1:     1 hg19 ct UserTrack xjizeijsisidu  chr1:44788752   1
#> 2:     2 hg19 ct UserTrack   xoijugisidu   chr1:1874526   1
#> 3:     3 hg19 ct UserTrack xoijiuytisidu chr1:187487526   1    


Edit: Pour en plus extraire la position en plus du chromosome :

Code : Tout sélectionner

library(data.table)
setDT(df)[
  
tstrsplit(ID"_"), 
  
by "index"
][
  
c("chr""position") := tstrsplit(V5":")
][]
#>    index   V1 V2        V3            V4             V5  chr  position
#> 1:     1 hg19 ct UserTrack xjizeijsisidu  chr1:44788752 chr1  44788752
#> 2:     2 hg19 ct UserTrack   xoijugisidu   chr1:1874526 chr1   1874526
#> 3:     3 hg19 ct UserTrack xoijiuytisidu chr1:187487526 chr1 187487526 


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: extraction chaine de caractère

Messagepar Fred Santos » 16 Mar 2021, 15:18

(Je m'incruste pour de tout petits compléments partiellement HS, en tout cas par rapport à R)

Aline Tavaud a écrit :Je ne connais pas encore très bien les expressions régulières, il faut que j'apprenne cela.

Oh que oui, ça sert toujours ! Un bon endroit pour s'entraîner et pour démarrer : https://regexone.com/

Aline Tavaud a écrit :Quelle est donc la manière d'écrire pour récupérer un ou plusieurs caractère compris entre deux caractères ?

Ça se joue ici, dans l'aide de la fonction sub() par exemple :

Code : Tout sélectionner

replacement: a replacement for matched pattern in ‘sub’ and ‘gsub’.
          Coerced to character if possible.  For ‘fixed = FALSE’ this
          can include backreferences ‘"\1"’ to ‘"\9"’ to parenthesized
          subexpressions of ‘pattern’.

C'est un concept utile au-delà de R : tu peux faire la même chose directement dans un éditeur de texte avancé (comme Notepad++ par exemple), à l'aide des fonctionnalités "Rechercher-Remplacer" (habituellement Ctrl + H, donc), qui supportent aussi des expressions régulières.

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: extraction chaine de caractère

Messagepar Sébastien Rochette » 16 Mar 2021, 15:27

Du coup, pour la version avec {dplyr} et {stringr} ce serait:

Code : Tout sélectionner

ID=c("hg19_ct_UserTrack_xjizeijsisidu_chr1:44788752","hg19_ct_UserTrack_xoijugisidu_chr1:1874526","hg19_ct_UserTrack_xoijiuytisidu_chr1:187487526")
index=c(1,2,3)
data <- data.frame(index, ID)

library(dplyr)
library(stringr)

# Extraire des numéros qui sont après "chr" et avant le signe `:`

data %>%
  mutate(numero = str_extract(ID, pattern = "(?<=chr)(\\d+)(?=:)"))
Sébastien
Dev, Consult, Formateur
ThinkR

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: extraction chaine de caractère

Messagepar Aline Tavaud » 16 Mar 2021, 15:37

Super, merci beaucoup pour toutes ces propositions !

Je vais étudier tout ça, mais d'après mes premiers essais sur mes données ça à l'air de marcher !

Aline


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité