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 :

Une fusion un peu particulière?


Sujet :

R

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Une fusion un peu particulière?
    Bonjour amis développeurs,

    Dans le cadre d'un projet pour mon université, je bloque sur une petite manipulation... Plutôt que vous présenter tout mon projet, je vais vous illustrer ce que je souhaite faire.

    J'ai :
    a b a d
    A 1 1 0 0
    B 0 0 1 1

    Je souhaite :

    a b d
    A 1 1 0
    B 1 0 1

    C'est donc tout bête. J'ai plusieurs colonnes avec le même nom que je souhaite repérer puis réunir. Evidemment je souhaite un code qui puisse s'appliquer à une matrice beaucoup plus grande (la colonne nommée "a" peut apparaître plus que 2 fois).

    A vos clavier
    Merci d'avance!

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    La fonction aggregate fait ce genre de chose.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    je ne suis pas convaincu que la fonction aggregate permette de faire ce genre de manipulation.
    Si tes données sont stockées dans une matrice alors tu peux faire comme ceci (il doit y a voir plus efficace et plus élégant aussi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #soit tab le nom de ta matrice
    t(rowsum(t(tab), colnames(tab)))
      a b d
    A 1 1 0
    B 1 0 1
    cdlt

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord merci à vous deux !

    J'ai essayé d'utiliser la fonction aggregate en vint (ça vient peut être de moi...). Je vais utiliser ta réponse Tototode qui est bien plus élégante que la mienne (qui contient environ 6 boucles xD, oui je suis accro aux boucles). Encore merci, à une prochaine!

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Je ne connaissait pas la fonction rowsum, qui est en fait un cas particulier/simplifié de la fonction aggregate qui aurait très bien marché ici, mais aurait été plus compliquée à utiliser.

    @AlexisMa : Les boucles on en utilise partout dans plein de langages, mais en R quand on fait une boucle, 95% du temps on devrais pas.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    qui est en fait un cas particulier/simplifié de la fonction aggregate
    Ca peut sembler être le cas mais je ne vois rien dans le code des fonctions qui aille dans le sens de cette affirmation. Les fonctions aggregate et rowsum ont des fonctionnement très différents :
    - rowsum fait appel à du code interne avec pour unique objectif de faire des somme sur les lignes,
    - aggregate fait appel à des lapply avec la fonction fun de ton choix. Le résultat peut être identique effectivement mais la manière d'y arriver très différente et donc le temps de calcul aussi (même si sur ce genre de manipulation la différence ne doit pas être visible).

    Une autre possiblité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sapply(unique(colnames(tab)), function(x) rowSums(tab[, x, drop = FALSE]))
    cdlt

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Je parlais de l'utilisation de ces fonctions et non de leur fonctionnement interne ou de leur performances.

    Les deux fonctions s'utilisent de manières très proches pour des résultats très proches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    aggregate(t(tab), list(colnames(tab)), sum)
      Group.1 A B
    1       a 1 1
    2       b 1 0
    3       d 0 1
    Bon là du coup rowsum a l'avantage de renvoyer directement une matrice sous la forme voulue donc autant l'utiliser.


    Après, oui, aggregate sur de gros jeux de données ça posera effectivement des problèmes de performances. Mais de mémoire en dessous de 100 000 lignes il n'y a pas de soucis.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/07/2011, 12h48
  2. Réduire une figure un peu particulière (?)
    Par GDMINFO dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 17/06/2009, 13h45
  3. Une requete un peu particulière ...
    Par ZiMammouth dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/02/2007, 17h27
  4. Une mise page un peu particulière
    Par krapoulos2006 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 20/12/2006, 15h45

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