IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Intersection de 2 fichiers


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Intersection de 2 fichiers
    Bonjour à tous,

    J'en appelle à vous car j'ai un "petit" problème de programmation sous R..
    Je possède 2 tableaux de données ayant des rownames correspondant à des noms de personnes. Certaines de ces personnes se trouvent être dans les 2 tableaux, alors que d'autres sont seulement dans l'un des 2 tableaux.
    Je souhaiterais créer un tableau/fichier ayant pour rownames seulement les individus communs aux 2 tableaux de données et comportant les informations relatives à ces individus que l'on trouve dans l'un et l'autre de ces 2 tableaux initiaux.
    Je pensais à une boucle permettant de chercher dans l'un des fichiers les individus appartenant à l'autre fichier, mais je ne vois pas comment la programmer.
    J'espère avoir été claire dans l'expression de mon problème..

    Je vous remercie d'avance de vos éclaircissements !

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Bonjour,

    Faites une recherche dans la documentation R sur la fonction merge()
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par ced Voir le message
    Bonjour,

    Faites une recherche dans la documentation R sur la fonction merge()
    Formidable ! Merci beaucoup !
    Cette fonction est parfaitement celle qu'il me faut, merci !
    En revanche, je rencontre le problème suivant lorsque je lui indique mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    merge(X,Y,by=intersect(rownames(X),rownames(Y))) ou bien merge(X,Y,by=intersect(rownames(X),rownames(Y)),by.x=rownames(X),by.y=rownames(Y))
    =>Erreur dans fix.by(by.x, x) :
    'by' doit spécifier des colonnes uniques correctes

    Savez vous d'où cela peut-il venir ?

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Oui, le nom des lignes (renvoyé par la fonction rownames()) n'est pas une colonne d'un data frame.
    Or, la fonction merge ne s'applique qu'à des colonnes de data frames
    Du coup, pour chaque data frame, il vous faut au préalable ajouter une colonne comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df1$nom <- rownames(df1)
    df2$nom <- rownames(df2)
    Puis vous faites le merge sur les colonnes "nom" de chacun des 2 data frames.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Une interruption internet a retardé ma réponse..
    Merci pour ce conseil, cependant, je rencontre un nouveau problème (ah, R !):
    Après avoir créé, comme vous me l'avez suggéré, des colonnes comportant les rownames, concaténées à mes 2 fichiers comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df1$nom = rownames(df1)
    df2$nom = rownames(df2)
    Ensuite, j'ai utilisé la fonction merge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    merge(df1,df2,by=intersect(df1$nom,df2$nom)),by.x=df1$nom,by.y=df2$nom)
    Mais je rencontre l'erreur suivante..:

    Error in fix.by(by.x, x) : 'by' must specify uniquely valid columns
    (en anglais, cette fois-ci ! ^^)

    Peut-être que je ne renseigne pas correctement les éléments de la fonction merge..?

    Merci à nouveau de votre aide !

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Citation Envoyé par NovicedDeChezNovice Voir le message
    Peut-être que je ne renseigne pas correctement les éléments de la fonction merge..?
    Effectivement, comme les 2 data frame ont le même nom pour leur colonne commune, il suffit de mettre (entre guillemets) le nom de cette colonne dans le paramètre "by" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    merge(df1, df2, by="nom")
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    En faisant ceci, j'obtiens seulement comme "merge" le nom des colonnes de mes 2 dataframes à la suite les uns des autres, combinés en un seul vecteur, avec aucune donnée concernant les individus (rownames) qui leur sont communs..

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    Bonjour,

    Il va falloir nous donner un peu plus de détail sur le contenu de vos data frames et sur votre code, parce que pour moi, le code suivant fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    > df1 <- data.frame(col1 = c(1, 2, 3, 5, 6, 7, 8, 9, 10), col2 = c(10.5, 1.3, 45.6, 2.3, 7.89, 7, 0.3, 6.9, 4.9))
    > row.names(df1) <- c("row1", "row2", "row3", "row5", "row6", "row7", "row8", "row9", "row10")
    > 
    > df2 <- data.frame(colA = c(1, 3, 4, 6, 8), colB = c(0.51, 0.32, 0.44, 0.86, 0.98))
    > row.names(df2) <- c("row1", "row3", "row4", "row6", "row8")
    > 
    > df1
          col1  col2
    row1     1 10.50
    row2     2  1.30
    row3     3 45.60
    row5     5  2.30
    row6     6  7.89
    row7     7  7.00
    row8     8  0.30
    row9     9  6.90
    row10   10  4.90
    > df2
         colA colB
    row1    1 0.51
    row3    3 0.32
    row4    4 0.44
    row6    6 0.86
    row8    8 0.98
    > 
    > df1$nom <- row.names(df1)
    > df2$nom <- row.names(df2)
    > 
    > merge(df1, df2, by = "nom")
       nom col1  col2 colA colB
    1 row1    1 10.50    1 0.51
    2 row3    3 45.60    3 0.32
    3 row6    6  7.89    6 0.86
    4 row8    8  0.30    8 0.98
    Au passage, dans mon message précédent, j'ai utilisé rownames, ce qui revient au même que row.names dans mon code ci-dessus.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Ca maaaaaaarche !
    Hum, pardon.
    Merci beaucoup pour votre aide et votre patience !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intersection de deux fichiers
    Par elhadiDZ dans le forum Pascal
    Réponses: 10
    Dernier message: 04/06/2012, 00h04
  2. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 10h38
  3. Réponses: 5
    Dernier message: 20/08/2002, 19h01
  4. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 19h31
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 10h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo