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 :

Différence de valeur suivant une variable / "SOMME.SI"


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur forestier
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur forestier

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Différence de valeur suivant une variable / "SOMME.SI"
    Bonjour,

    J'aimerais faire la différence entre deux valeurs numérique, pour chaque identifiant et suivant des dates.
    Par exemple dans la PJ : différence 2016 - 2008 de flux0 pour AGENCOUR22NA1
    différence 2016 - 2008 de flux0 pour AIGNAY3re1...

    Sachant qui suivant les identifiants, les dates varient mais je veux toujours la différence entre l'année max et l'année mini.

    Si qqun peut m'aider. Merci
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Un peu de {dplyr} peut nous sortir d'affaire. L'idée est de faire dans cet ordre :
    1) calculer les années min et max par identifiant (group_by + mutate. Pas summarise ici parce que je veux garder le détail des lignes et toutes les autres colonnes)
    2) ne conserver que ces lignes (filter) --> on n'a plus que 2 observations par identifiant
    3) calculer l'écart sur flux0 avec max(flux0)-min(flux0) cette fois dans un summarise pour n'avoir qu'une ligne par identifiant en sortie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    evol <- flux_8455_15_20 %>%
       group_by(IDENTIFICATION) %>%
       mutate(annee_min = min(ANNEE),
                  annee_max = max(ANNEE)) %>%
       filter(ANNEE == annee_min | ANNEE == annee_max) %>%
       summarise(flux0 = max(flux0)-min(flux0))
    Bon courage.
    Olivier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur forestier
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur forestier

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Merci pour l'aide c'est déjà mieux le seul petit problème et lors du calcul de différence, je ne veux pas forcement la différence flux0max - flux0min mais la différence entre les dates. Donc si mon flux0max en 2008 et mon flux0min en 2018, je souhaite un résultat négatif qui correspond bien à valeur18 - valeur08. Je pense que c'est de la que j'ai encore une erreur.
    Si vous avez une solution pour ça ^^
    Merci

  4. #4
    Membre expérimenté
    Inscrit en
    Novembre 2009
    Messages
    703
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 703
    Points : 1 311
    Points
    1 311
    Par défaut aggregate
    Bonjour,

    Une proposition "à la main" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df <- read.table(header = TRUE, text = "
    ANNEE flux0 IDENTIFICATION
    2008 0.00 AGENCOUR21NA1
    2012 2.53 AGENCOUR21NA1
    2014 0.53 AGENCOUR21NA1
    2016 0.53 AGENCOUR21NA1
    2012 1.68 AIGNAY3r1
    2014 2.00 AIGNAY3r1
    2016 0.02 AIGNAY3r1
    ")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    df_date_min <- aggregate(ANNEE~IDENTIFICATION,df,min)
    df_date_min <- merge(df,df_date_min,by=c("IDENTIFICATION","ANNEE"))[,-2]
    names(df_date_min)=c("IDENTIFICATION","flux0_ANNEE_min")
     
    df_date_max <- aggregate(ANNEE~IDENTIFICATION,df,max)
    df_date_max <- merge(df,df_date_max,by=c("IDENTIFICATION","ANNEE"))[,-2]
    names(df_date_max)=c("IDENTIFICATION","flux0_ANNEE_max")
     
    evol <- merge(df_date_min,df_date_max,by="IDENTIFICATION")
    evol$diff_flux0 <- evol$flux0_ANNEE_max - evol$flux0_ANNEE_min
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > evol
      IDENTIFICATION flux0_ANNEE_min flux0_ANNEE_max diff_flux0
    1  AGENCOUR21NA1            0.00            0.53       0.53
    2      AIGNAY3r1            1.68            0.02      -1.66
    Cordialement,

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    On peut aussi remplacer dans mon code précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    summarise(flux0 = max(flux0)-min(flux0))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mutate(diff_flux0 = flux0[2L] - flux0[1L])
    Peut-être qu'il restera des lignes en doublon à éliminer (avec la fonction distinct)... je n'ai pas testé.
    Bon courage.
    Olivier

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur forestier
    Inscrit en
    Juin 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur forestier

    Informations forums :
    Inscription : Juin 2020
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à vous deux
    AB

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/05/2015, 15h10
  2. Réponses: 3
    Dernier message: 20/01/2011, 11h24
  3. Réponses: 3
    Dernier message: 13/02/2009, 20h34
  4. Réponses: 9
    Dernier message: 30/05/2006, 10h33

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