Changer en partie la valeur d'une variable

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

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 03 Avr 2021, 08:15

Bonjour ,
Je travaille en bio avec des plaques à puits dans lesquelles je cultive des cellules.
Après divers traitements je fais des images (plusieurs pour chaque puits nommés field).
j'obtiens un data frame avec une colonne nommée label qui contient du texte qui a la forme suivante :
GRE047503_210311140001_B02f26d1.C01_0.tif:0001-0003
GRE047503_210311140001_B02f26d1.C01_100.tif:0001-0009

De cette chaîne, j'extrais le nom du puits (well), celui du champ (field) et l'identifiant du noyau étudié (NucId)
plateBim$Well <- substr (plateBim$Label,24,26) --> B02
plateBim$Field <- substr (plateBim$Label,27,29) --> f26
plateBim$NucId <- substr (plateBim$Label,37,39) --> 0.t ou 100 selon les 2 exemples employés

Comme on peut s'en rendre compte, tout va bien pour Well et Field. Par contre, pour NucId je ne trouve pas comment n'extraire que l'identifiant du noyau car celui-ci se compose de 1 à 3 chiffres. J'ai donc pris le partie d'extraire les 3 caractères et d'essayer de supprimer ensuite les valeurs "." et ".t".
Le problème est que je ne sais pas comment faire dans R.
Jusqu'à présent, je repassai dans Excel mais ça serai vraiment mieux de pouvoir le faire directement sous R.

Je vous remercie par avance de vos réponses.
Bon WE
Patricia

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Changer en partie la valeur d'une variable

Messagepar Pierre-Yves Berrard » 03 Avr 2021, 08:59

Bonjour,

Les expressions régulières permettent de repérer et d'extraire des motifs dans des chaînes de caractères n'ayant pas une longueur fixe.

Ici, le motif serait le suivant :

Code : Tout sélectionner

".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)"

Les parenthèses signalent les portions (groupes) à extraire (capturer).

Une façon pratique pour votre besoin est ensuite d'utiliser tidyr::extract dont l'objectif est de former de nouvelles colonnes à partir d'une à l'aide d'une expression régulière contenant des parenthèses capturantes :

Code : Tout sélectionner

plateBim <- data.frame(Label = c("GRE047503_210311140001_B02f26d1.C01_0.tif:0001-0003",
 "GRE047503_210311140001_B02f26d1.C01_100.tif:0001-0009"))

library(tidyr)

extract(
  plateBim,
  Label,
  into = c("Well", "Field", "NucId"),
  regex = ".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)",
  remove = FALSE,
  convert = FALSE
)

#>                                                   Label Well Field NucId
#> 1   GRE047503_210311140001_B02f26d1.C01_0.tif:0001-0003  B02   f26     0
#> 2 GRE047503_210311140001_B02f26d1.C01_100.tif:0001-0009  B02   f26   100  
PY

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

Re: Changer en partie la valeur d'une variable

Messagepar Fred Santos » 03 Avr 2021, 09:26

Pierre-Yves Berrard a écrit :Ici, le motif serait le suivant :

Code : Tout sélectionner

".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)" 

Tiens, c'est rigolo :-) J'avais spontanément pensé à ceci pour la troisième question :

Code : Tout sélectionner

= "GRE047503_210311140001_B02f26d1.C01_0.tif:0001-0003"
= "GRE047503_210311140001_B02f26d1.C01_100.tif:0001-0009"

sub(pattern = "([[:alnum:]_.]*)_([0-9]*).tif:([[:digit:]-]*)",
    replacement = "\\2",
    x = c(x, y))
#> "0"   "100"   

Je découvre d'ailleurs que R ne connaît pas la classe [:ascii:] ni la classe [:word:], c'est amusant. En langage Lisp (par exemple), c'est donc même plus simple grâce aux classes dispo :

Code : Tout sélectionner

(replace-regexp-in-string
 "\\([[:ascii:]]*\\)_\\([0-9]*\\).tif:\\([[:ascii:]]*\\)"
 "\\2"
 "GRE047503_210311140001_B02f26d1.C01_100.tif:0001-0003")

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 03 Avr 2021, 11:40

Bonjour Pierre-Yves
merci pour votre retour.
Mais comment puis-je intégrer cette fonction pour que dans mon data frame qui contient, entre autre, la colonne "label" j'obtienne les 3 colonnes supplémentaires "Well", "Field" et "NucId" ?
Encore merci,
Patricia

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 03 Avr 2021, 12:00

Pourriez-vous également expliciter le motif :
".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)"
Je suis perdue ...

".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)"

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 03 Avr 2021, 12:02

Pourriez-vous également expliciter le motif :
".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)" ?
Je suis perdue ...

".+_[0-9]+_ (.{3}) (.{3}) .+_([0-9]+)"
? Well ? Field ? ?

Je ne comprends pas comment on se repère dans la chaîne de caractères pour savoir où commencer et où s'arrêter :-(
Merci de m'éclairer
Patricia

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Changer en partie la valeur d'une variable

Messagepar Pierre-Yves Berrard » 03 Avr 2021, 12:03

Il n'y a rien besoin d'intégrer, extract retourne précisément le data.frame initial enrichi des 3 nouvelles colonnes. Il faut juste affecter le résultat à un objet :

Code : Tout sélectionner

plateBim_new <- extract(plateBim, ...)
PY

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Changer en partie la valeur d'une variable

Messagepar Pierre-Yves Berrard » 03 Avr 2021, 12:07

Patricia OBEID a écrit :Pourriez-vous également expliciter le motif :
".+_[0-9]+_(.{3})(.{3}).+_([0-9]+)" ?
Je suis perdue ...

".+_[0-9]+_ (.{3}) (.{3}) .+_([0-9]+)"
? Well ? Field ? ?

Je ne comprends pas comment on se repère dans la chaîne de caractères pour savoir où commencer et où s'arrêter :-(
Merci de m'éclairer
Patricia

En décomposant un peu :
  • .+ : un nombre quelconque de n'importe quel caractère
  • _ : un underscore
  • [0-9]+ : un nombre quelconque de chiffres
  • .{3} : n'importe quel caractère exactement 3 fois
PY

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 03 Avr 2021, 14:12

Merci bcp, maintenant c'est clair mais je ne suis pas sure de pouvoir appliquer à un autre cas ...

J'avais aussi essayé avec str_replace

Code : Tout sélectionner

plateBim$NucId <- str_replace(plateBim$NucId,".t","")

-> ce qui fonctionne pour les cas avec n.t mais reste les cas nn. (où n est un chiffre)

quand dans la même logique je fais

Code : Tout sélectionner

plateBim$NucId <- str_replace(plateBim$NucId,".",""

je vois disparaitre les 0 et certaines cellules deviennent vides ...
Je ne comprends pas.
Savez-vous pourquoi ?
Patricia

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Changer en partie la valeur d'une variable

Messagepar Pierre-Yves Berrard » 03 Avr 2021, 15:16

C'est sûrement dû au fait que dans une expression régulière le point représente n'importe quel caractère.
Pour désigner réellement un point il faut l'"échapper" avec des antislash :

Code : Tout sélectionner

str_replace(plateBim$NucId"\\.t""")
PY

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: Changer en partie la valeur d'une variable

Messagepar Patricia OBEID » 04 Avr 2021, 07:29

Bonjour Pierre-Yves,
Effectivement, avec \\.t ça fonctionne bien.
Merci de votre aide précieuse.
Bien à vous
Patricia


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité