Fusion de matrice

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

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Fusion de matrice

Messagepar Pierre-Marc Chouinard » 20 Fév 2017, 21:21

Bonjour,

J'ai un problème lorsque j'effectue la fusion de 2 matrices de données avec des noms de colonnes communs et je n'arrive pas a identifier le problème...


J'ai une matice d'origine "A" avec 12 000 lignes arrangés par NO_VOY, NO_AFFEC, NO_SORTI, NO_TRAIT,COD_ESP. Certaines lignes sont des déboublement de ces informations qui correspondent à des fréquences de longueur établie pour certaines espèces.

1-Matrice d'origine
(Matrice A)
NO_VOY NO_AFFEC NO_SORTI NO_TRAIT COD_ESP long NB_POIS ENGIN MAILLE PROF
v1436 A 1 2 412 NA NA OB 150 335
v1436 A 1 2 221 NA NA OB 150 335
v1436 A 1 2 52 NA NA OB 150 335
v1436 A 1 2 31 63 7 OB 150 335
v1436 A 1 2 31 64 10 OB 150 335
v1436 A 1 2 31 65 7 OB 150 335
v1436 A 1 2 31 66 2 OB 150 335
v1436 A 1 3 411 NA NA OB 150 150
v1436 A 1 3 31 NA NA OB 150 150
v1436 A 1 4 412 NA NA OB 150 225


2- Je veux passer à un format une ligne par NO_AFFEC+NO_SORTI+NO_TRAIT+COD_ESP et une somme du NB POIS. J'ai donc effectuer l'opération suivante:

A1 <- summaryBy (NB_POIS ~ NO_VOY + NO_AFFEC + NO_SORTI + NO_TRAIT+COD_ESP,
data = A, keep.names=TRUE, FUN = sum)


3- Ce qui me donne la matrice de sortie suivant (plus courte: 6000 lignes, dû à la sommation):
(Matrice A1)
NO_VOY NO_AFFEC NO_SORTI NO_TRAIT COD_ESP NB_POIS
v1436 A 1 2 412 NA
v1436 A 1 2 221 NA
v1436 A 1 2 52 NA
v1436 A 1 2 31 26
v1436 A 1 3 411 NA
v1436 A 1 3 31 NA
v1436 A 1 4 412 NA


4- Je voudrais ensuite complete cette matrice (A1) avec le reste des colonnes de la matrice d'origine A (ENGIN MAILLE PROF). Je Fusionne donc les 2 matrices avec une operation du style LEFT JOIN. Les 2 method donne le même résultats:

A2 <- join(A1, A, type = "left")
ou
A3 <-merge(x = A1, y = A,all.x = TRUE)


5- Ce qui me donne la matrice de sortie suivant (Matrice A2 ou A3):
NO_VOY NO_AFFEC NO_SORTI NO_TRAIT COD_ESP NB_POIS ENGIN MAILLE PROF
v1436 A 1 2 412 NA OB 150 335
v1436 A 1 2 221 NA OB 150 335
v1436 A 1 2 52 NA OB 150 335
v1436 A 1 2 31 26 NA NA NA
v1436 A 1 3 411 NA OB 150 150
v1436 A 1 3 31 NA OB 150 150
v1436 A 1 4 412 NA OB 150 225


??? Les information supplémentaires (ENGIN MAILLE PROF) ce charge correctement, sauf pour les lignes avec une somme de NB_POIS où la fusion n'inclut que des NA au lieu des informations associés à cette activité (NO_VOY, NO_AFFEC, NO_SORTI, NO_TRAIT). Et si je remplace les NA de la variable NB_POIS par des zeros (dans la matice A1), alors tout les infos supplémentaire deviennent de NA lors de la fusion.

Merci

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

Re: Fusion de matrice

Messagepar Pierre-Yves Berrard » 20 Fév 2017, 23:58

Bonjour,

Il me semble qu'il y a deux problèmes :
  1. Ne pas spécifier de "by=" dans merge conduit à avoir comme clés de fusion NO_VOY, NO_AFFEC, NO_SORTI, NO_TRAIT, COD_ESP, mais aussi NB_POIS, ce qui n'est pas souhaitable ?
  2. Il faudrait enlever les doublons de A avant de merger avec A1 ?

PS : vous parlez de matrices, mais c'est bien des data.frame, n'est-ce pas ?
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Fusion de matrice

Messagepar Pierre-Marc Chouinard » 21 Fév 2017, 14:44

Oui merci, il s'agit bien de data frame désolé pour la deformation de language dû à l'habitude.

Donc, j'ai essayé d'ajouté le "by=" dans mon merge, pour exclure comme suggérer le NB_POIS, je me bute cependant à un message d'erreur que je n'arrive pas à interpreter vue mon niveau en R. Deuxièment le but derière mon idée d'effectuer un "left join" est justement de completer un data frame avec l'information d'un deuxième plus complet sans avoir à effacer de doublons (qui n'en sont pas vraiment) en se servant d'une clé de tri pour effectuer l'appariment. Selon ce que je comprend du merge, c'est ce que devrait faire les option all.x=TRUE et all.y=FALSE.

1- J'ai effectué les operation suivant:

A<-A[order(A$NO_VOY, A$NO_AFFEC, A$NO_SORTI, A$NO_TRAIT,A$COD_ESP),]
A1<-A1[order(A1$NO_VOY, A1$NO_AFFEC, A1$NO_SORTI, A1$NO_TRAIT,A1$COD_ESP),]

A3 <-merge(A1,A,by= "NO_VOY", "NO_AFFEC", "NO_SORTI", "NO_TRAIT", "COD_ESP",all.x=TRUE, all.y=FALSE)


2- Et j'obtient le message d'erreur suivant:

> A3 <-merge(A1,A,by= "NO_VOY", "NO_AFFEC", "NO_SORTI", "NO_TRAIT", "COD_ESP",all.x=TRUE, all.y=FALSE)
Error in if (sort) res <- res[if (all.x || all.y) do.call("order", x[, :
argument is not interpretable as logical
In addition: Warning message:
In merge.data.frame(A1, A, by = "NO_VOY", "NO_AFFEC", :
column name ‘NO_AFFEC’ is duplicated in the result

Merci

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

Re: Fusion de matrice

Messagepar Pierre-Yves Berrard » 21 Fév 2017, 15:01

Mauvaise nouvelle : la syntaxe n'est pas bonne. Il faut quelque chose du style :

Code : Tout sélectionner

by = c("NO_VOY", "...", ... )

Bonne nouvelle : contrairement à SAS par exemple, pas besoin de trier les tables au préalable !
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Fusion de matrice

Messagepar Pierre-Marc Chouinard » 21 Fév 2017, 16:08

Merci, avec la nouvelle synthaxe c'est presque ça. Désolé j'ai en effet quelques relant de SAS parfois...

J'arrive à faire la junction, mais pas de "type left join". Ça doit être dû à ma mauvaise comprehension de la procedure MERGE. Peu importe que j'essait les différentes combinaison de :

all.x=TRUE, all.y=FALSE
all.x=FALSE, all.y=TRUE
all= TRUE
all=FALSE,

A3 <-merge(x=A1,y=A,by= c("NO_VOY", "NO_AFFEC", "NO_SORTI", "NO_TRAIT", "COD_ESP"),all.x=TRUE, all.y=FALSE)

Cela ne change rien au résultat du dataframe produit. Les informations s'agencent correctement au niveau de lignes, selon la clé de tri fournit et l'information additionnelle est bien ajoutée, cependant j'ai toujours les 12 000 lignes de mon dataframe de depart "A" au lien d'obtenir seulement les 6000 lignes de mon dataframe "A1" avec les informations complémentairse de "A" comme souhaité.


Si le "left join", au sens ou je le conçois, n'est pas possible, existe-il une facon simple et rapide d'effacer les lignes à occurrence multiples identiques tout en conservant la structure dataframe ?


Merci

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

Re: Fusion de matrice

Messagepar Pierre-Yves Berrard » 21 Fév 2017, 19:27

Pierre-Marc Chouinard a écrit :Si le "left join", au sens ou je le conçois, n'est pas possible, existe-il une facon simple et rapide d'effacer les lignes à occurrence multiples identiques tout en conservant la structure dataframe ?

C'est bien un left_join, puisqu'on essaie d'associer toutes les clés du data.frame de gauche. Le résultat "inattendu" vient du fait que pour une clé unique à gauche, il y a plusieurs correspondances à droite. Comme il ne sait pas laquelle prendre, merge les garde toutes.
?merge a écrit :The rows in the two data frames that match on the specified columns are extracted, and joined together. If there is more than one match, all possible matches contribute one row each.

Solution pour supprimer les doublons (il y a peut-être mieux) :

Code : Tout sélectionner

A1b <- subset(A, select= -c(long, NB_POIS)) #supprime les colonnes qui différencient les lignes
A_sans_doubl <- A1b[!duplicated(A1b), ]
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Fusion de matrice

Messagepar Pierre-Marc Chouinard » 21 Fév 2017, 19:58

Merci pour l'aide et les explications, j'avais en effet mal interprété la mécanique du "left join". J'ai finalement créer une clé unique de tri pour pouvoir effacer mes doublons ce n'est pas nécessairement élégant, mais ca marche:

Code : Tout sélectionner

A3 <-merge(A1,A ,by= c("NO_VOY", "NO_AFFEC", "NO_SORTI", "NO_TRAIT", "COD_ESP"),all.x=TRUE, all.y=FALSE)
doublons <- which(duplicated(A3$ID_uni_esp))
A4<-A3[-doublons,]


Merci de votre aide

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

Re: Fusion de matrice

Messagepar Pierre-Yves Berrard » 21 Fév 2017, 20:31

Pierre-Marc Chouinard a écrit :Merci pour l'aide et les explications, j'avais en effet mal interprété la mécanique du "left join"

Pour être honnête, je pensais comme vous jusqu'à hier. J'ai aussi appris un truc. ;-)
PY


Retourner vers « Questions en cours »

Qui est en ligne

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