coller 2 date frames avec meme pivot Merge marche pas

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

Michel Arnaud
Messages : 2
Enregistré le : 04 Oct 2005, 06:49

coller 2 date frames avec meme pivot Merge marche pas

Messagepar Michel Arnaud » 15 Fév 2007, 15:00

Bonjour
J'ai 2 data Frames D1 et D2 compose chacun d'un header et de 2 colonnes nom et v1
D1
nom v1
toto a
toto b
titi a
titi b
titi c

nom v2
toto u
toto v
toto w
titi x
titi y
titi z
titi t

Je souhaite obtenir un data Frame unique collant ces 2 colonnes de la facon suivante et mettant des donnees manquantes (ou autres) la ou il en manque
exemple :
nom v1
toto a u
toto b v
toto NA w
titi a x
titi b y
titi c z
titi NA t

Merci de votre aide
Bien cordaielement

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

Messagepar Logez Maxime » 15 Fév 2007, 15:27

Bonjour,



Je pense que le nom de ton post n'est pas vrai merge fonctionne très bien mais pas dans ton cas, en effet merge ici va faire le produit cartésien des deux si tu merges par "nom", ce qui est logique car pour une valeur toto de D1 il existe plusieurs valeurs toto dans D2. R ne peut pas faire correspondre a ce moment la la première toto de D1 à la première valeur toto de D2, la deuxième valeur toto de D1 à la deuxième valeur toto de D2, etc ... je ne pense pas que merge soit fait pour ça (mais je n'utilise que très peu cette fonction).
Un petit exemple :

Code : Tout sélectionner

ted1
   nom v1
1 toto  a
2 toto  b
3 titi  a
4 titi  b
5 titi  c
ted2
   nom v2
1 toto  u
2 toto  v
3 toto  w
4 titi  x
5 titi  y
6 titi  z
7 titi  t
merge(ted1,ted2,by = "nom")
    nom v1 v2
1  titi  a  x
2  titi  a  y
3  titi  a  z
4  titi  a  t
5  titi  b  x
6  titi  b  y
7  titi  b  z
8  titi  b  t
9  titi  c  x
10 titi  c  y
11 titi  c  z
12 titi  c  t
13 toto  a  u
14 toto  a  v
15 toto  a  w
16 toto  b  u
17 toto  b  v
18 toto  b  w
ted1[,3] <- c(1:2,4:6)
ted2[,3] <- 1:7
ted1
   nom v1 V3
1 toto  a  1
2 toto  b  2
3 titi  a  4
4 titi  b  5
5 titi  c  6
ted2
   nom v2 V3
1 toto  u  1
2 toto  v  2
3 toto  w  3
4 titi  x  4
5 titi  y  5
6 titi  z  6
7 titi  t  7
merge(ted1,ted2,by = c("V3","nom"),all=TRUE)
  V3  nom   v1 v2
1  1 toto    a  u
2  2 toto    b  v
3  3 toto <NA>  w
4  4 titi    a  x
5  5 titi    b  y
6  6 titi    c  z
7  7 titi <NA>  t

Dans le dernier cas ça a un sens car une seule valeur de ted1$V3 fait référence à une seule valeur de ted2$V3.

Après j'avoue ne pas savoir comment faire pour récupérer rapidement dans ce cas les correspondances entre D1 et D2.

Maxime

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

Messagepar Logez Maxime » 16 Fév 2007, 09:21

Bonjour,


juste une petite suite a ma réponse afin de trouver les correspondances entre les lignes de D1 et de D2, attention ça ne marchera que si tes tableaux sont ordonnés selon la même colonne qui sert de référence : "nom".

Code : Tout sélectionner

ted1
   nom v1
1 toto  a
2 toto  b
3 titi  a
4 titi  b
5 titi  c
ted2
   nom v2
1 toto  u
2 toto  v
3 toto  w
4 titi  x
5 titi  y
6 titi  z
7 titi  t
res <- NULL
u <- 1
for (i in 1:7){
   print(u) # pas nécessaire de le mettre sert juste pour l'exemple
   if (ted2$nom[i]==ted1$nom[u]){
     res <- c(res,i)
     u <- u+1
     }
   else {
     next
     }
   }
[1] 1 # compare avec la première valeur de ted1
[1] 2
[1] 3
[1] 3 # ici comme pas de correspondance entre ted1$nom[3] et ted2$nom[3] il va comparer ted2$nom[4] avec ted1$nom[3]
[1] 4
[1] 5
[1] 6

ted2[,3] <- 1:7
ted2
   nom v2 V3
1 toto  u  1
2 toto  v  2
3 toto  w  3
4 titi  x  4
5 titi  y  5
6 titi  z  6
7 titi  t  7
ted1[,3] <- res
ted1
   nom v1 V3
1 toto  a  1
2 toto  b  2
3 titi  a  4
4 titi  b  5
5 titi  c  6

merge(ted1,ted2,by = c("V3","nom"),all=T)
  V3  nom   v1 v2
1  1 toto    a  u
2  2 toto    b  v
3  3 toto <NA>  w
4  4 titi    a  x
5  5 titi    b  y
6  6 titi    c  z
7  7 titi <NA>  t


Tu retombes bien sur le tableau que tu souhaites, après il existe surement des méthodes pour faire la même chose de façon plus rapide et plus proprement, ici ça s'apparente plus a de la bidouille mais bon dans ton cas ça marche (a la colonne V3 près).

Maxime.


Retourner vers « Questions en cours »

Qui est en ligne

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