listes et listes de listes (limma)

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

Romain Fenouil
Messages : 2
Enregistré le : 24 Jan 2008, 13:30

listes et listes de listes (limma)

Messagepar Romain Fenouil » 24 Jan 2008, 16:15

Bonjour,

J'ai recemment pris place dans un laboratoire pour procéder à de l'analyse de données issues de puces à ADN (technique du ChIP-Chip). Je suis familier des langages de programmations "classiques" mais je trouve déroutante l'utilisation de certains types données sous R.

Mon probleme concerne l'utilisation de listes de listes :

J'utilise en effet la bibliothèque limma pour lire des fichiers de données de puces ADN.

Chaque lecture d'un fichier me renvoie un objet de type RGlist (qui semble en fait être une liste) contenant notamment un vecteur d'intensité lumineuse rouge nommé "R" (idem pour vert "G").

Etant obligé de charger tous mes fichiers dans un objet RGlist different, j'ai créé une liste dans laquelle je range mes RGlist pour chaque fichier.

Jusque là tout va bien, j'accede à chaque vecteur de luminosité rouge de mes RGlist par la syntaxe :
Puces[[indice]]$R

Très content de moi je pensais avoir enfin compris le fonctionnement des listes avec R. :wink:

L'histoire se corse lorsque j'essaye d'afficher un boxplot me permettant de comparer les niveaux de luminosité rouge dans chaque fichier.

En effet, impossible d'utiliser la syntaxe " Puces[[1:4]]$R " j'obtiens un message d'erreur "échec d'indexation récursive au niveau 3"

J'ai essayé moult façons d'obtenir les données directement de ma liste de liste mais sans succès. La solution actuelle que j'ai trouvée consiste a extraire mes données de luminosité dans une variable a l'aide d'une boucle avant de les afficher. Cela ne me semble cependant pas très propre.

Si vous avez une meilleure solution je suis preneur et pour plus d'infos sur mes variables etc n'hesitez pas à me demander ce dont vous avez besoin.




Gros PS :

Pour les experts de limma et plus précisement du ChIP-Chip, nous travaillons sur des puces genome-wide en 11 slides (chacune couvrant une partie du génome).
Il semble que les RGlists ne sont pas designés pour ce genre de manips (ChIP-Chip) puisque si l'on essaye de charger plusieurs fichiers dans une meme RGlist, les noms de genes des premiers fichiers sont ecrasés.
Ainsi, charger plusieurs fichiers dans la meme RGlist sert uniquement à charger plusieurs samples d'une meme puce ?

Merci beaucoup et excusez moi pour ce looooong message.

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

Messagepar Logez Maxime » 24 Jan 2008, 17:53

Bonjour,


je ne connais pas ce package et je ne connais pas exactement ce qui est contenue dans une RGList ni sont format. Mais essaie peut-être ça :

Code : Tout sélectionner

R <- sapply(RGlist,"[[","R") #pour extraire les R de chaque "sous liste"
# sous réserves que les R aient tous la même taille ...
# passage en tableau en prévision du boxplot
R <- as.data.frame(R)
boxplot(R)


Maxime

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 25 Jan 2008, 07:31

Bonjour,
En complément de la réponse précédente, le problème ne vient pas du package (que je ne connais pas) mais de la syntaxe de R. On ne peut pas, en effet, utiliser la syntaxe liste[[ind]] si ind est un vecteur de longueur supérieure à 1. C'est très logique, en effet pour x de classe quelconque x[ind] a pour effet de sélectionner les élément de objet x ayant pour indices ind, et de retourner un objet de même classe que x. Si x est une liste, x[ind] est donc aussi une liste. Mais rien ne dit que les contenus des éléments d'une liste sont de même classe, donc x[[ind]] n'a en général pas de sens sauf si ind est de longueur 1.
Pour accéder en boucle aux contenus des éléments d'une liste il faut en effet (voir ci-dessus) utiliser les fonctions lapply ou sapply.

FB

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

quelques éléments sur l'indexation des listes

Messagepar Nicolas Péru » 25 Jan 2008, 09:18

bonjour,

Tout d'abord le cas des listes "simples" :

Code : Tout sélectionner

test = lapply(vector(6,mode="list"),function(x) x<-rbinom(10,10,p=0.5))
test
[[1]]
 [1] 6 4 7 6 6 7 6 3 7 6

[[2]]
 [1] 9 4 3 5 7 5 3 3 5 4

[[3]]
 [1] 2 4 7 6 2 5 6 7 6 5

[[4]]
 [1] 4 3 4 3 8 3 3 5 5 5

[[5]]
 [1] 6 4 5 7 3 7 6 6 4 5

[[6]]
 [1] 7 6 3 6 6 3 7 4 4 2

Code : Tout sélectionner

test[[1]] # le premier élément de la liste
 [1] 6 4 7 6 6 7 6 3 7 6

Code : Tout sélectionner

test[[1:2]] ou test[[c(1,2)]] #va chercher la 2ème valeur du premier élément de la liste
[1] 4


Code : Tout sélectionner

y = 5:6 #je crée vecteur [i,j] de longeur 2 qui vérifie : 1<=i<=5 et 1<=j<=10
test[y]
[[1]]
 [1] 6 4 5 7 3 7 6 6 4 5
[[2]]
 [1] 7 6 3 6 6 3 7 4 4 2

test[[y]]
[1] 7
y = 5:7 #maintenant y a une longueur de 3
test[[y]]
Erreur dans test[[y]] : échec d'indexation récursive au niveau 2 # R ne sait pas quoi faire de la troisième valeur.


Le double [[ permet d'accéder à l'objet contenu dans la liste quel qu'il soit. Il faut noter qu'ainsi on s'affranchit de la classe list qui est parfois un peu lourde à manipuler.
Alors que le simple [ ne permet de parcourir la liste qu'élément par élément. De plus, les éléments ainsi récupérés appartiennent toujours à la classe "listes".

Maintenant si on crée une liste de liste :

Code : Tout sélectionner

test <- vector(3,mode="list")
test = lapply(test,function(x) x<-lapply(vector(3,mode="list"),function(x) x<-rbinom(10,10,p=0.5)))
test
[[1]]
[[1]][[1]]
 [1] 3 6 1 3 8 6 5 6 5 3

[[1]][[2]]
 [1] 4 6 6 5 3 4 4 5 8 4

[[1]][[3]]
 [1] 4 4 4 6 5 6 6 3 5 5


[[2]]
[[2]][[1]]
 [1] 5 7 2 6 5 4 3 5 5 7

[[2]][[2]]
 [1] 5 6 4 6 8 6 6 6 4 6

[[2]][[3]]
 [1] 6 4 8 3 5 4 4 4 7 5


[[3]]
[[3]][[1]]
 [1] 2 5 4 3 4 7 3 7 5 3

[[3]][[2]]
 [1] 7 5 3 4 5 6 3 5 4 5

[[3]][[3]]
 [1] 5 7 6 5 3 5 5 5 5 6

Code : Tout sélectionner

y=1:3 # on recrée un y car les limites des indexes ont changé
test[y] # toujours pareil on sort les éléments de la liste principale un par un. ici y = {1,2,3} donc on a sorti toute la liste
[[1]]
[[1]][[1]]
 [1] 3 6 1 3 8 6 5 6 5 3

[[1]][[2]]
 [1] 4 6 6 5 3 4 4 5 8 4

[[1]][[3]]
 [1] 4 4 4 6 5 6 6 3 5 5


[[2]]
[[2]][[1]]
 [1] 5 7 2 6 5 4 3 5 5 7

[[2]][[2]]
 [1] 5 6 4 6 8 6 6 6 4 6

[[2]][[3]]
 [1] 6 4 8 3 5 4 4 4 7 5


[[3]]
[[3]][[1]]
 [1] 2 5 4 3 4 7 3 7 5 3

[[3]][[2]]
 [1] 7 5 3 4 5 6 3 5 4 5

[[3]][[3]]
 [1] 5 7 6 5 3 5 5 5 5 6

> test[[y]] # cette fois ci test a une troisième dimension et une indexation a trois valeur donne donc un résultat
[1] 6 # 3ème valeur de la 2ème sous liste du premier éléments de la liste principale.(ouf! :D)


voilà et pour appliquer directement des fonctions à des sous listes on peut faire comme ceci:

Code : Tout sélectionner

lapply(listprincipale, function(x) lapply(x,FUN))

dans notre exemple:

Code : Tout sélectionner

> lapply(test, function(x) lapply(x,mean))
[[1]]
[[1]][[1]]
[1] 4.6

[[1]][[2]]
[1] 4.9

[[1]][[3]]
[1] 4.8


[[2]]
[[2]][[1]]
[1] 4.9

[[2]][[2]]
[1] 5.7

[[2]][[3]]
[1] 5


[[3]]
[[3]][[1]]
[1] 4.3

[[3]][[2]]
[1] 4.7

[[3]][[3]]
[1] 5.2


Ceci pouvant être démultiplié suivant le nombre de liste imbriquée.

on notera ceci : ;)

Code : Tout sélectionner

par(mfrow=c(2,2))
bob<-lapply(test,boxplot)


bob contient alors une liste avec toutes les données des boxplot. une figure est produite qui fait un boxplot par élément de chaque sous liste mais qui les regroupe par sous liste:

[img=http://img90.imageshack.us/img90/6685/exempleboxxr4.th.jpg]

enfin pour finir, si les sous listes contiennent des vecteurs de même longueur, il vaut mieux directement les regrouper en data frame

Nicolas

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 25 Jan 2008, 10:15

En effet, ce que vient d'écrire Nicolas est parfaitement exact, j'avais oublié dans ma réponse le cas de l'indexation multiple.
x[[ind]] est donc correct si ind est un vecteur, la difficulté vient de la signification totalement différente de x[ind] et x[[ind]]. Dans le premier cas, ind est une suite d'indices d'éléments à extraire de x, alors que dans le second, ind est un indice à plusieurs dimensions et x[[c(i,j,k,l)]] est équivalent à x[[i]][[j]][[k]][[l]]

FB

Romain Fenouil
Messages : 2
Enregistré le : 24 Jan 2008, 13:30

Messagepar Romain Fenouil » 25 Jan 2008, 12:18

Merci beaucoup,

Je suis tout d'abord étonné par votre reactivité, ça fait plaisir de trouver une aide aussi rapide et efficace.

De plus vous avez dans un premier temps proposé une solution qui fonctionne puis fourni des explications detaillées concernant mon problème.

Les listes etant un type clé dans R, il me semblerait utile de trouver de telles explications dans toute documentation ce qui n'est pas le cas... heureusement vous etes la :)

Je vous remercie donc encore une fois d'avoir pris du temps pour me répondre et je pense relire vos messages plusieurs fois pour en saisir tous les details. Il se peut que d'autres questions surgissent de cette investigation... vous en serez informé :wink:
Je vais notamment me pencher sur les fonctions apply.

En esperant pouvoir aider a mon tour des gens par la suite.

Cordialement.


Retourner vers « Questions en cours »

Qui est en ligne

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