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 :

Aggregate avec condition


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chargé d'études
    Inscrit en
    Janvier 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : Janvier 2015
    Messages : 93
    Par défaut Aggregate avec condition
    Bonjour,
    pour agréger et en sommant sur N les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V1  LIB1  V2  LIB2  N
    a   b   c  d      10
    a   b   c  d      20
    je lance la commande suivante pour obtenir : a b c d 30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aggregate(N~V1+LIB1+V2+LIB2, data=tableau,sum)
    Je voudrai maintenant agréger en sommant sur N uniquement les lignes bijectives du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V1  LIB1 V2 LIB2  N
    a  b  c  d     10
    c  d  a  b     20
    Etant débutant, je ne sais pas trop comment m'y prendre. Quelqu'un peut-il svp me mettre sur une piste

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 72
    Par défaut
    Bonjour,

    Si j'ai bien compris, tu voudrais qu'un tableau comme celui-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    V1  LIB1  V2  LIB2  N
    a   b   c  d      10
    d   b   a   c   20
    b   d   a   c   15
    a   a   c   d   12
    d   a   c   a   10

    donne un tableau comme cela :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    V1  LIB1  V2  LIB2  N
    a   b   c  d      45
    a   a   c   d   22
    Est-ce bien cela ?

  3. #3
    Membre confirmé
    Homme Profil pro
    chargé d'études
    Inscrit en
    Janvier 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : Janvier 2015
    Messages : 93
    Par défaut aggregate avec condition
    bonsoir,
    dans l'idée oui, à ceci près que V1 et V2 sont liées à LIB1 et LIB2 (ce sont des codes insee et des libellés de commune). Mon pb me semble un peu plus simple.

    Il me semble que j'ai trouvé une solution:

    Coma représente des tableaux de codes Origine Destination et n le nombre de liaisons
    Comb représente des tableaux de codes Destination Origine et n le nombre de liaisons

    Mon objectif est de sommer pour chaque couple O-D le nombre total n de liaisons, sans prendre en compte le sens des liaisons.

    j'ai commencé par supprimer les O-D où coma = comb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rcomb<-comb[which(comb$coma!=comb$comb),] 
     Rcoma<-coma[which(coma$coma!=coma$comb),]
    j'ai créé une vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z<-c("comb", "libb", "coma", "liba", "n")
    qui m'a permis de permuter les colonnes dans l'un des tableaux (j'ai choisi Rcomb)
    j'ai ensuite renommé les colonnes de Rcomb de façon à avoir les noms de colonnes dans le même ordre que dans le tableau Coma (seules les valeurs ont au final permuté).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    names(pRcomb)<-c("coma", "liba", "comb", "libb", "n")
    j'ai uni les tableaux Coma et Rcomb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    barreau<- rbind.data.frame(Rcoma, pRcomb)
    puis j'ai agrégé les lignes en sommant sur n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f2s<-aggregate(n~coma+liba+comb+libb, data=barreau,sum)
    Cela a l'air de fonctionner (il faut que je vérifie encore), mais ma méthode n'est certainement pas très orthodoxe ... , je n'ai par exemple pas fait "d'aggregate avec condition"...)

  4. #4
    Membre confirmé
    Homme Profil pro
    chargé d'études
    Inscrit en
    Janvier 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chargé d'études

    Informations forums :
    Inscription : Janvier 2015
    Messages : 93
    Par défaut aggregation avec condition
    après vérification cela ne fonctionne pas

    donc j'en reviens au début, j'ai un tableau du type :
    x y N
    A B n1
    C D n2
    F G n3
    B A n4
    Z V n5

    je voudrai obtenir :

    A B (ou BA peu importe) n1+n4
    C D n2
    F G n3
    Z V n5

    si quelqu'un a une idée, je suis preneur.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Par défaut
    Bonjour,
    En reprenant à partir du dernier message (#4) et en faisant de la pub pour dplyr (pub car la même chose peut être faite sans la bibliothèque) :
    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
    library("dplyr")
     
    donnees <- data.frame(
        x = c("A", "C", "F", "B", "Z"),
        y = c("B", "D", "G", "A", "V"),
        N = sample(5),
        stringsAsFactors = FALSE)
     
    print(donnees)
     
    indices_comb <- na.exclude(charmatch(donnees$x, donnees$y))
     
    cibles <- slice(donnees, indices_comb)
     
    resultat <- slice(donnees, -indices_comb)
     
    resultat <- bind_rows(resultat, list(
        x = cibles$x[1L],
        y = cibles$y[1L],
        N = sum(cibles$N))
    )
     
    print(resultat)
    > print(donnees)
      x y N
    1 A B 1
    2 C D 5
    3 F G 4
    4 B A 2
    5 Z V 3
    
    > print(resultat)
    Source: local data frame [4 x 3]
    
          x     y     N
      (chr) (chr) (int)
    1     C     D     5
    2     F     G     4
    3     Z     V     3
    4     B     A     3
    Reste à avoir si cela est généralisable aux données réelles que vous avez.

  6. #6
    Membre émérite
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Par défaut
    Partant de l'hypothèse que les deux colonnes x et y du tableau sont des chaines de caractères, on peut commencer par transformer le tableau comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sort.col <- function( col.1, col.2) {
         ifelse( col.1 < col.2, col.1, col.2)
    }
     
    tab.result <- transform( tab.result, x=sort.col( x, y), y=sort.col( y, x))
    puis appliquer sur le résultat la fonction aggregate.

    En effet, R sait ordonner des chaînes de caractères selon l'ordre lexicographique et donc les ordonner selon cet ordre. Par contre, il différencie les minuscules des majuscules. Les fonctions tolower ou toupper permettent de mettre les chaînes de caractères en minuscules ou en majuscules.

    Si ces colonnes sont des facteurs, il suffit de les remplacer par des chaînes de caractères avec la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.result$x <- as.character( tab.result$x)
    Par contre, cette transformation est inutile dans le cas de l'utilisation des fonctions de transformation de casse tolower et toupper car elles commencent par transformer leur argument en chaînes de caractères avant de changer de casse.

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

Discussions similaires

  1. AGGREGATE avec CONDITIONS
    Par oudin.charles dans le forum Développement de jobs
    Réponses: 11
    Dernier message: 18/06/2009, 17h56
  2. Réponses: 1
    Dernier message: 29/08/2008, 15h21
  3. ALTER VIEW avec condition
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/04/2004, 17h22
  4. Index avec conditions
    Par marhnix dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/03/2004, 10h48
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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