Comparaison de plusieurs Data Frame

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

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 09 Mai 2017, 09:21

Bonjour, dans le cadre de mon stage je dois comparer plusieurs Data Frame afin d'obtenir une "liste" de Protéines/Peptides présents dans mes 5 échantillons

Pour ce faire j'ai utilisé le code suivant :

Code : Tout sélectionner

 E1 <- E1[paste(E1$ProteinID, E1$Peptide)%in%paste(S3s$ProteinID, S3s$Peptide),]
> E1 <- S1s[paste(S1s$ProteinID, S1s$Peptide)%in%paste(S2s$ProteinID, S2s$Peptide),]
> E2 <- E1[paste(E1$ProteinID, E1$Peptide)%in%paste(S3s$ProteinID, S3s$Peptide),]
> E3 <- E2[paste(E2$ProteinID, E2$Peptide)%in%paste(S4s$ProteinID, S4s$Peptide),]


Où S1s etc représentent mes données sous forme de Data Frame

Mon petit souci c'est que j'ai plusieurs fois le même peptide parfois (même pas le même nombre de fois entre les différents jeux de données)
Avec ce code j'obtiens les peptides en communs mais ça ne me donne qu'une partie du résultat escompté (en effet si j'ai 5 occurrence dans une liste et 3 dans l'autre je n'aurai que 3 fois le peptide).
De plus ça ne m'affiche le résultat que pour la 1° liste écrite dans le code.

Du coup j'aimerai savoir si je pouvais améliorer mon code pour pouvoir observer toutes les occurrences des peptides qui m'intéressent quelque soit le nombre dans les Data Frame de base.

J'espère être à peu près claire .....

Merci par avance pour vos réponses.

Michèle.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Comparaison de plusieurs Data Frame

Messagepar Serge Rapenne » 09 Mai 2017, 09:52

Bonjour,

si tu veux la liste de tous les couples proteine/peptide, ceci devrait fonctionner,

Code : Tout sélectionner

liste_pep_prot<-Reduce(union,list(paste(E1$ProteinID, E1$Peptide),paste(E2$ProteinID, E2$Peptide),paste(E2$ProteinID, E3$Peptide),paste(E4$ProteinID, E4$Peptide),paste(E5$ProteinID, E5$Peptide))


Serge

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Re: Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 09 Mai 2017, 10:34

Merci Serge toutefois ce n'est pas exactement ce dont j'ai besoin ......
En fait j'aimerai avoir en résultat une Data Frame avec tous mes peptides d'intérêts (+ d'autres données qui ne sont pas utiles au tri mais qui sont dans les Data Frame de base)
Et j'aimerai toutes les occurrences des peptides dans toutes les Data Frame

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Comparaison de plusieurs Data Frame

Messagepar Gabriel Terraz » 09 Mai 2017, 10:40

Salut,
Je ne comprend pas exactement ce que tu veux, tu pourrais peut-être faire un petit exemple qui illustre ce que tu as et ce que tu veux obtenir.
L'aide serait beaucoup plus efficace :)

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Comparaison de plusieurs Data Frame

Messagepar Serge Rapenne » 09 Mai 2017, 11:48

Peut être ,

Code : Tout sélectionner

Reduce(function(x, y) merge(x, y, by=c("ProteinID", "Peptide"),all=TRUE), list(S1,S2,S3,S4,S5))


Serge

Manon Jean
Messages : 14
Enregistré le : 04 Mai 2017, 15:08

Re: Comparaison de plusieurs Data Frame

Messagepar Manon Jean » 09 Mai 2017, 12:19

Pour connaître les peptides communs aux 5 échantillons, je dirais faire une boucle for avec un if à l'intérieur. Mais il faudrait d'abord créer une liste de base avec tous les peptides possibles :

Pour i va de 1 à la fin de ta liste de base , ajouter un peptide à une liste vide si le peptide est dans l'échantillon 1 OU l'échantillon 2 OU l'échantillon 3.
C'est bien quelque chose comme ça que tu veux ?

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Re: Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 09 Mai 2017, 13:22

Image

J'ai des résultats de ce type là et je veux obtenir tous les couples Protéines/Peptides en commun pour les 5 Data Frame
De plus j'ai d'autres données (colonnes à droite) et j'aimerai que ça me les intègrent

J'espère que c'est un poil plus clair

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Re: Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 09 Mai 2017, 13:24

Manon Jean a écrit :Pour connaître les peptides communs aux 5 échantillons, je dirais faire une boucle for avec un if à l'intérieur. Mais il faudrait d'abord créer une liste de base avec tous les peptides possibles :

Pour i va de 1 à la fin de ta liste de base , ajouter un peptide à une liste vide si le peptide est dans l'échantillon 1 OU l'échantillon 2 OU l'échantillon 3.
C'est bien quelque chose comme ça que tu veux ?


Oui dans l'idée mais avec un ET (il faut que la présence soit dans les 5 échantillons)

Je voulais éviter les boucles mais je sens que je ne vais guère avoir le choix

Manon Jean
Messages : 14
Enregistré le : 04 Mai 2017, 15:08

Re: Comparaison de plusieurs Data Frame

Messagepar Manon Jean » 09 Mai 2017, 14:02

Dans ce cas là peut-être ceci :

Code : Tout sélectionner

 for (i in 1:ncol(talistedepeptidesdebase)){
   if(E1[,i]==E2[,i]==E3[,i]==E3[,i]==E5[,i])
      listevide=listevide[,+E1[,i]]}


Il y a sûrement des erreurs mais je pense que dans l'idée c'est ça, ça te donne une base.

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Comparaison de plusieurs Data Frame

Messagepar Serge Rapenne » 09 Mai 2017, 14:22

Est ce que tous les df ont les mêmes colonnes ?

pour le couple A1E295ICATB_PIG/EQWPNCPTIK qui apparait 7 fois dans ton ex, que faut il dans la sortie ?

un exemple du mode de fusion sur 2 df serait un vrai plus soit en utilisant dput (cf viewtopic.php?f=1&t=3302) soit en fournissant un ex simplifié sur des données constituées pour l'occasion du style :

Code : Tout sélectionner

S1<-data.frame(Prot=c("a","a","a","b","b"), pep=c(1,1,2,2,3),col_ad1=1:5)
S2<-data.frame(Prot=c("a","a","b","b","b"), pep=c(1,3,2,4,3),col_ad2=1:5)

et de fournir la sortie voulue pour cet exemple

Serge

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Re: Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 09 Mai 2017, 15:00

Alors pour celui qui apparait 7 fois dans cet exemple (qui est une dataframe) il faut que ça me sorte les 7 lignes correspondantes.
J'ai actuellement fusionné mes dataframe du coup s'il apparait 20 fois une fois toutes les dataframe fusionnées il me faut les 20 lignes correspondantes.
J'espère être à peu près claire .... Pas toujours simple d'expliquer par écrit sur un forum ....

Michèle

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Comparaison de plusieurs Data Frame

Messagepar Serge Rapenne » 09 Mai 2017, 15:11

je réitéré ma question, est ce que les 5 data.frame ont les même colonnes ?

dans l’affirmative n'est ce pas tout simplement
rbind(S1,S2,S3,S4,S5) que tu cherches à faire ?

Serge

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Comparaison de plusieurs Data Frame

Messagepar Gabriel Terraz » 09 Mai 2017, 15:59

Je crois que j'ai compris :

Tout d'abord, des données bidon (merci Serge) :

Code : Tout sélectionner

S1<-data.frame(Prot=c("a","a","a","b","b"), pep=c(1,1,2,2,3),col_ad1=rnorm(5))
S2<-data.frame(Prot=c("a","a","b","b","b"), pep=c(1,2,2,3,3),col_ad1=rnorm(5))
S3<-data.frame(Prot=c("a","a","a","a","b"), pep=c(1,1,2,3,3),col_ad1=rnorm(5))


On les passe en liste pour faciliter le travail qui suit :

Code : Tout sélectionner

A <- list(S1,S2,S3)


On crée un identifiant unique composé des deux colonnes d’intérêt (avec paste)

Code : Tout sélectionner

Apaste <- lapply(A, function(x) data.frame(newid=paste(x$Prot,x$pep,sep="_"),x[,-c(1:2)]))


Et enfin, on fait un merge les dataframe en cascade :

Code : Tout sélectionner

Reduce(function(x, y) merge(x, y, by = "newid",all = F), Apaste)


On se rapproche de la solution ?

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

Re: Comparaison de plusieurs Data Frame

Messagepar Logez Maxime » 09 Mai 2017, 20:07

Bonjour,

si j'ai bien suivi :

Code : Tout sélectionner

A <- list(S1, S2, S3)
auxi <- Reduce(intersect, lapply(A, function(x) paste(x$Prot, x$pep, sep ="_")))
res <- do.call(rbind, lapply(A, function(x) x[paste(x$Prot, x$pep, sep ="_")%in%auxi,]))
# si besoin :
res <- res[do.call(order, res[1:2]),]

#ou
auxi <- Reduce(intersect, lapply(A, function(x) paste(x$Prot, x$pep, sep ="_")))
res <- do.call(rbind, A)
res <- res[with(res, paste(Prot, pep, sep = "_") %in% auxi,]
# si besoin :
res <- res[do.call(order, res[1:2]),]
Cordialement,
Maxime

Michèle Raffaelli
Messages : 11
Enregistré le : 25 Avr 2017, 16:22

Re: Comparaison de plusieurs Data Frame

Messagepar Michèle Raffaelli » 10 Mai 2017, 08:03

J'ai finalement trouvé un truc assez simple et qui marche (comme quoi je ne me creuse jamais assez la tête ....)

Code : Tout sélectionner

>A <- S1s[paste(S1s$ProteinID, S1s$Peptide)%in%paste(S2s$ProteinID, S2s$Peptide),]
> B <- S2s[paste(S2s$ProteinID, S2s$Peptide)%in%paste(S1s$ProteinID, S1s$Peptide),]
> C <- rbind.data.frame(A,B)
>C1 <- C[order(C$ProteinID, C$Peptide),]


Et je recommence avec la nouvelle data frame pour comparer avec mes autres séries ^^

Merci pour votre aide

Michèle


Retourner vers « Questions en cours »

Qui est en ligne

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