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 et valeurs manquantes


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut aggregate et valeurs manquantes
    Bonjour,

    Je souhaiterais calculer la somme du croisement de plusieurs variables, avec toutes les valeurs (éventuellement à 0) pour tous les croisements possibles.

    Je m'explique.
    Voici un code qui me produit la somme d'une variable V3, au croisement de deux variables V1 et V2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T <- data.frame(V1=c(1,1,1,2,2),V2=c(1,2,2,1,1),V3=c(1,2,3,4,5))
    X <- aggregate(T$V3,by=list(V1=T$V1,V2=T$V2),FUN=sum)
    X
    Le résultat est qu'on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      V1 V2 x
    1  1  1 1
    2  2  1 9
    3  1  2 5
    Alors que je voudrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      V1 V2 x
    1  1  1 1
    2  2  1 9
    3  1  2 5
    4  2  2 Na
    Dans ce résultat attendu, tous les croisements de V1 et V2 sont listés. Avec Na pour V1=2 et V2=2, car il n'y a pas d'observations telles que V1=2 et V2=2.

    Y-a-t-il un moyen simple d'obtenir ce résultat ?

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut
    Bon, finalement je suis parvenu à obtenir quelquechose.
    C'est un peu lourd mais voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # data frame initial
    T <- data.frame(V1=c(1,1,1,2,2),V2=c(1,2,2,1,3),V3=c(1,2,3,4,5)) ; T
    # Liste de tous les croisement de modalités possibles
    X <- as.data.frame(with(T,table(V1,V2))) ; X
    # Somme de la variable V3 pour le croisement des modalités
    Y <- aggregate(T$V3,by=list(V1=T$V1,V2=T$V2),FUN=sum) ; Y
    # Fusion des deux tables selon les variables souhaitées
    Z <- merge(X,Y,by=c('V1','V2'),all=TRUE) ; Z
    # On met des 0 à la place des NA
    Z[4][is.na(Z[4])] <- 0 ; Z
    J'obtiens donc le tableau final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      V1 V2 Freq x
    1  1  1    1 1
    2  1  2    2 5
    3  1  3    0 0
    4  2  1    1 4
    5  2  2    0 0
    6  2  3    1 5
    C'est bien ce que je voulais.

    Mais si quelqu'un a une méthode plus concise pour faire la même chose, je suis preneur.

  3. #3
    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,
    Citation Envoyé par enicnath Voir le message
    [...] Mais si quelqu'un a une méthode plus concise pour faire la même chose, je suis preneur.
    Il ne s'agit à tout casser que 5 lignes de code, ce qui est plutôt « concis. » Cela dit, comme l'idée générale est plutôt floue, je vous propose une approximation de ce que j'en ai saisi.

    1) De la combinatoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    T <- data.frame(
        V1 = c(1, 1, 1, 2, 2),
        V2 = c(1, 2, 2, 1, 3),
        V3 = c(1, 2, 3, 4, 5)
    )
    utils::combn(c(T$V1, T$V2), 2L) 
     
    # ou
    combinat::combn(c(T$V1, T$V2), 2L) 
    combinat::combn2(c(T$V1, T$V2))
    À noter l'argument fun qui permet d'appliquer une fonction arbitraire sur chaque composant du résultat.

    2) Des tableaux de contingence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xxx <- table(T$V1, T$V2)
    addmargins(xxx)
    Bref, le contexte général me semble bipartite mais comprendre ce à quoi l'ensemble vise m'échappe.

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut
    Citation Envoyé par juliatheric Voir le message
    Bref, le contexte général me semble bipartite mais comprendre ce à quoi l'ensemble vise m'échappe.
    Merci de ces propositions.
    En fait, je me suis aperçu après coup que je n'avais en effet pas besoin de toutes ces combinaisons.
    Ça aura au moins servi à améliorer ma compréhension de R.
    Bonne journée

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

Discussions similaires

  1. renseigner des valeurs manquantes
    Par mouche dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/05/2007, 12h00
  2. Remplacement de valeurs manquantes
    Par couanp dans le forum MATLAB
    Réponses: 21
    Dernier message: 16/05/2007, 18h14
  3. Probleme Hash, valeur manquant
    Par aikinhdo dans le forum Langage
    Réponses: 2
    Dernier message: 27/04/2007, 13h40
  4. Auto-increment : valeurs manquantes ?
    Par kileak dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/11/2006, 16h23
  5. Comment trouver les valeurs manquante d'une série ?
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2006, 09h38

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