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 :

Somme d une colonne avec condition sous une autre colonne


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : Santé

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut Somme d une colonne avec condition sous une autre colonne
    Bonjour a tous,
    j ai le problème suivant: dans un dataframe, je cherche a faire la somme des lignes de la colonne B lorsque la colonne A est egale a 0.

    J ai fait le graphique suivant (sous excel mais ma question porte bien sur R), je souhaite additionner les valeurs 2, 3, 1, 5 et 4 (en colonne B) car, pour ces lignes, la valeurs en A est nulle. Le résultat souhaite est donc 15.
    Le resultat suivant sera 2+7+3 =12.

    Nom : Somme en R.jpg
Affichages : 4619
Taille : 43,8 Ko

    Pour info si A =0 alors B<>0 et inversement.

    J ai examine la fonction cumsum mais je ne sait pas si c est adapte.

    En vous remerciant de votre aide.

  2. #2
    Membre confirmé
    Femme Profil pro
    Chef d'entreprise
    Inscrit en
    Juin 2020
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Chef d'entreprise

    Informations forums :
    Inscription : Juin 2020
    Messages : 27
    Par défaut
    Et quel est le résultat attendu ?

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    si j'ai bien compris a chaque fois que l'on trouve une valeur differante de zero
    on remet les compteur a zero et on relance la sommation des ligne b

    imaginons un tableau TAB[0...N,A..B]
    et un tableau de resultat TABRES[0...N]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    i   = 0
    j   = 0
    POUR TOUT ELEMENTS DE  TAB FAIRE
      SI (TAB[I,A]) <> 0 ALORS
         J =J+1
      SINON 
        TABRES[J] = TABRES[J]+TAB[I,B]
      I=I+1
    FIN POUR

  4. #4
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Création d'une variable groupe
    Bonjour,

    Vous pouvez construire une variable groupe puis utiliser la fonction aggregate().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    dftest <- read.table(header = TRUE, text = "
    A B
    5 0
    0 2
    0 3
    0 1
    0 5
    0 4
    4 0
    0 2
    0 7
    0 3
    6 0
    ")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dftest$groupe <- ifelse(dftest$A != 0, 1, 0)
    dftest$groupe[dftest$groupe == 1] <- 1:sum(dftest$groupe)
    library(data.table)
    setDT(dftest)
    while(min(dftest$groupe)==0) dftest[, groupe := ifelse(groupe==0, shift(groupe), groupe)]
    setDF(dftest)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > dftest
       A B groupe
    1  5 0      1
    2  0 2      1
    3  0 3      1
    4  0 1      1
    5  0 5      1
    6  0 4      1
    7  4 0      2
    8  0 2      2
    9  0 7      2
    10 0 3      2
    11 6 0      3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dfres <- aggregate(B ~ groupe, dftest, sum)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > dfres
      groupe  B
    1      1 15
    2      2 12
    3      3  0
    Cordialement,

  5. #5
    Membre éclairé
    Homme Profil pro
    Formateur et consultant R
    Inscrit en
    Juin 2020
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formateur et consultant R
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2020
    Messages : 36
    Par défaut
    Bonjour,

    J'avais préparé une solution similaire à @mgdondon, mais j'ai oublié de la poster
    Je la met quand même. L'idée de base est la même, il s'agit de trouver le moyen de créer des groupes.

    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
    library(tidyverse)
     
    mes_data <- data.frame(
      A = c(1, 0, 0, 2, 0, 0, 0),
      B = c(0, 2, 3, 0, 2, 8, 1)
    )
    mes_data
    #>   A B
    #> 1 1 0
    #> 2 0 2
    #> 3 0 3
    #> 4 2 0
    #> 5 0 2
    #> 6 0 8
    #> 7 0 1
    Vous devez trouver le moyen de créer des groupes

    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
     
    mes_data %>%
      # Creer numéro de groupe pour les lignes non manquantes. On s'en moque si le numéro de groupe n'est pas réellement continu, puisqu'il est artificiel.
      mutate(group_A = ifelse(A == 0, NA, 1:n())) %>%
      # Remplir les groupes manquants
      fill(group_A) %>%
      # calcul de la somme par groupe
      group_by(group_A) %>%
      summarise(
        somme = sum(B)
      )
    #> `summarise()` ungrouping output (override with `.groups` argument)
    #> # A tibble: 2 x 2
    #>   group_A somme
    #>     <int> <dbl>
    #> 1       1     5
    #> 2       4    11
    Au passage, j'ajouterai que pour créer un bon exemple reproductible pour vos questions, vous pouvez regarder cet article de blog qui vient de sortir: https://thinkr.fr/reprex-ou-comment-...aide-poliment/

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : Santé

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut
    Bonjour et merci a tous de votre aide.
    J ai decide de suivre les conseil de Statnmap et j ai utilise vos intructions. Ca ne fonctionne pas sous forme de pipe par contre ca fonctionne comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    POandLifeOrd <- mutate(POandLifeOrd, Index = ifelse(InstAdded == 0, NA, 1:n())) # to create a new column "Index" 
    POandLifeOrd <- fill (POandLifeOrd, Index, .direction="down")
    la somme comme vous l indique ci dessous ne fonctionne pas:
    summarise(
    somme = sum(InstRemoved)
    )

    J obtiens le message suivant:
    Error in summarise(somme = sum(InstRemoved)) :
    object 'InstRemoved' not found



    Donc en fait, j ai le resultat suivant avec les 2 lignes de codes que je montre ci dessus:
    Nom : POcust1.jpg
Affichages : 4386
Taille : 31,8 Ko

    Je precise (c etait pas clair dans ma demande initiale), je souhaite garder les lignes ou InstAdded est !=0 mais je souhaite afficher la somme des InstRemoved quand ceux ci sont !=0.
    Donc en clair , quelquechose comme ca (on voit que la somme de 4 lignes avec une valeur de 0.1 fait bien 0.4):
    Nom : POcust2.jpg
Affichages : 4384
Taille : 20,6 Ko

    Merci encore de passer qq minutes sur mon cas.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur avant-vente
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur avant-vente
    Secteur : Santé

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Par défaut
    ok j ai progresse.

    Je vous avais montre ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    POandLifeOrd <- mutate(POandLifeOrd, Index = ifelse(InstAdded == 0, NA, 1:n())) 
    POandLifeOrd <- fill (POandLifeOrd, Index, .direction="down")
    Je rajoute ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    POandLifeOrdAgg <- aggregate (POandLifeOrd$InstRemoved, by=list(POandLifeOrd$HospName, POandLifeOrd$InstName, POandLifeOrd$InstAdded, POandLifeOrd$Index), FUN=sum)
     
    colnames(POandLifeOrdAgg) [colnames(POandLifeOrdAgg)=="Group.1"] <- "HospName" #renaming columns
    colnames(POandLifeOrdAgg) [colnames(POandLifeOrdAgg)=="Group.2"] <- "InstName"
    colnames(POandLifeOrdAgg) [colnames(POandLifeOrdAgg)=="Group.3"] <- "InstAdded"
    colnames(POandLifeOrdAgg) [colnames(POandLifeOrdAgg)=="Group.4"] <- "Index"
    colnames(POandLifeOrdAgg) [colnames(POandLifeOrdAgg)=="x"] <- "InstRemoved"
     
    POandLifeOrdAgg <- POandLifeOrdAgg[,c("HospName","InstName","InstAdded","InstRemoved","Index")] 
     
    POandLifeOrdAgg <- POandLifeOrdAgg[order(POandLifeOrdAgg$Index,POandLifeOrdAgg$InstRemoved), ] 
    print (POandLifeOrdAgg)
    et j obtien a peu pret ce que je veux:
    Nom : POcust3.jpg
Affichages : 4350
Taille : 14,7 Ko

    Merci a tous de votre aide.

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

Discussions similaires

  1. [Google Sheets] Copier / Coller une ligne avec condition sur un autre onglet
    Par bunz13 dans le forum APIs Google
    Réponses: 5
    Dernier message: 18/08/2018, 11h26
  2. Réponses: 15
    Dernier message: 17/07/2017, 16h05
  3. Réponses: 4
    Dernier message: 26/05/2014, 11h11
  4. Réponses: 3
    Dernier message: 06/06/2011, 12h56
  5. [XL-2000] somme par compteur mais avec conditions
    Par Rrrroh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/07/2010, 19h02

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