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 :

Aggregation de pays et somme de type sum(i, x(i,j,k,l))


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Aggregation de pays et somme de type sum(i, x(i,j,k,l))
    Bonjour à tous,

    Je dispose d'un tableau qui pourrait être simplifié comme suit (tableauinitial) :

    PAYS ITEM tonnes_produites
    pays1 | porc | 289
    pays1 | bœuf | 750
    pays1 | volaille | 91
    pays2 | porc | 939
    pays2 | bœuf | 710
    pays2 | volaille | 957
    pays3 | porc | 809
    pays3 | bœuf | 435
    pays3 | volaille | 839
    pays4 | porc | 351
    pays4 | bœuf | 328
    pays4 | volaille | 804
    pays5 | porc | 501
    pays5 | bœuf | 875
    pays5 | volaille | 966

    et je voudrais obtenir le tableau suivant :

    REGION |ITEM |tonnes_produites
    Reg1 |porc |1228
    Reg1 |bœuf |1460
    Reg1 |volaille |1048
    Reg2 |porc |1661
    Reg2 |bœuf |1638

    Je suis nouveau dans R, excusez-moi pour cette question triviale, mais je ne trouve pas de tuto simple à ce sujet et mon tableau est très grand. J'aurais tendance à faire des vecteurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Reg1 <- c(pays1,pays2)
    Reg2 <- c(pays3,pays4,pays5)
    Allreg <-c(Reg1,Reg2)
    A créer la colonne je ne sais comment, et ensuite utiliser aggregate comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableaufinal <- aggregate(tonnes_produites ~  REGION+ITEM, 
                                       data = tableauinitial, 
                                       FUN = sum)
    Pourriez-vous m'éclairer ?

    Merci beaucoup !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé cette solution. Mais je la trouve assez compliquée. Des idées de simplification ?

    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
    # Vecteurs pays/region
    Reg1 <- c("pays1","pays2")
    Reg2 <- c("pays3","pays4","pays5")
     
    # Extraction des sous-tableaux
    Reg1.tab <- tableau_depart %>% filter(Country %in% Reg1)
    Reg2.tab <- tableau_depart %>% filter(Country %in% Reg2)
     
    # Ecriture d'une colonne avec le nom de region associé
    Reg1.tab <- cbind(REGION = "Reg1", Reg1)
    Reg2.tab <- cbind(REGION = "Reg2", Reg2)
     
    # superposition des tables
    Regions.tab <- rbind(Reg1.tab, Reg2.tab)
     
    # Somme sur les pays par produit
    tableau_final <- aggregate(tonnes_produites ~ REGION + ITEM , 
                               data = Regions.tab, 
                               FUN = sum)

  3. #3
    Membre éclairé
    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
    Points : 793
    Points
    793
    Par défaut
    Le problème est d'ajouter une colonne REGION au tableau pour que la fonction la reconnaisse, sachant qu'un pays appartient à une région. La solution la plus simple est de créer un data.frame à deux colonnes, la première le pays et la seconde la région et de fusionner ce data.frame avec tableauinitial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pays.region <- data.frame( PAYS=..., REGION=...)
    tableauinitial <- merge( tableauinitial, pays.region, by="PAYS")

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Points : 24
    Points
    24
    Par défaut Résolution étape par étape
    Essayons de résoudre votre problème en deux étapes.

    Premièrement, il va falloir créer la variable Region.

    Pour cela, vous gagnerez plus en énergie et en temps en utilisant un tableur
    comme Libreoffice calc ou excel. A partir d'une nouvelle feuille (feuil2) contenant cote à cote
    pays et region par exemple:

    A | B
    -------------
    Pays | Region
    ---------------
    Pays 1 | Reg1
    Pays 2 | Reg1
    Pays 3 | Reg1
    Pays 4 | Reg2
    Pays 5 | Reg2
    Pays 6 | Reg2
    Pays 7 | Reg2
    Pays 8 | Reg3
    ...
    Pays 100 | Reg100

    créez une colonne 'Region' dans la première feuille de calcul et utiliser la fonction 'recherchev'
    pour la renseigner.

    A |B |C |D
    --------------------------------
    Pays | Item | Tonne | Region
    -----------------------------------
    Pays 3 | porc | 10 | =recherchev(A2, feuille!A1:B100, 2)

    Ensuite incrémenter et importer la base de données dans R.

    Cependant, il est également possible de le faire dans R.
    Pour cela, je propose d'utiliser la fonction 'within'.
    Convenons d'appeler 'mydata' votre base de données, Region1 le vecteur contenant les pays de la première région,
    Region2 le vecteur contenant les pays de la deuxième région, etc.
    Une commande permettant de faire cela est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mydata <- within(mydata, { Region <- NA
                                               Region[Pays %in% Region1] <-"Reg1"
                                               Region[Pays %in% Region2] <-"Reg2"
                                               ...
                                               Region[Pays %in% Regionn] <-"Regn"                                       
                                                        })
    Secondo, utiliser aggregate pour calculer la somme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aggregate(Tonne~Region+Item, FUN=sum)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour ces réponses!
    Voici le code exact en reprenant la solution de stat_hat. A noter qu'il est probablement possible d'utiliser le package "dplyr" pour faire ces opérations! En pièce jointe le fichier de départ. A bientôt!

    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
     
     
    # Verifier le dossier de travail
     
    getwd()
     
    # Charger le tableau de données et l'afficher dans R
     
    mydata <- read.csv("mydata.csv")
    View(mydata)
     
    #Créer les vecteurs regions
     
    v_Region1 <- c("pays1", "pays2")
    v_Region2 <- c("pays3", "pays4", "pays5")
     
    #Créer la colonne REGION avec les correspondances
     
    mydata2 <- within ( mydata, { 
                                REGION <- NA 
                                          REGION[PAYS %in% v_Region1] <-"Reg1"
                                          REGION[PAYS %in% v_Region2] <-"Reg2"
                                }
                      )
    # Aggregation par region, item
     
    mydata3 <- aggregate(tonnes_produites~REGION+ITEM, 
                         data = mydata2 , 
                         FUN=sum)
     
    # Visualiser mydata3 et exporter en csv
     
    View(mydata3)
    write.csv(mydata3, "mydata3.csv")
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/10/2014, 07h59
  2. Macro qui fait la somme par type de produit
    Par kensem dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/04/2013, 17h24
  3. somme de variables de type date
    Par tounsi dans le forum Oracle
    Réponses: 28
    Dernier message: 12/01/2006, 15h42
  4. Pb récupération d'une somme avec SUM()
    Par momo99 dans le forum InterBase
    Réponses: 3
    Dernier message: 01/11/2005, 15h38
  5. Double somme (SUM) entre deux tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/02/2005, 22h26

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