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

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Anthony Baretti
Messages : 4
Enregistré le : 12 Juin 2020, 05:59

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

Messagepar Anthony Baretti » 12 Juin 2020, 06:06

Bonjour,

J'aimerais faire la différence entre deux valeurs numériques, pour chaque identifiant et suivant des dates.
Par exemple ici : différence 2018 - 2008 de flux0 pour AABERSCOL12NA2
différence 2018 - 2014 de flux0 pour AGENCOUR14NA1 ..

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


AGENCE CODE_FORET ESS ANNEE PLLE `INDICE(UES)` flux0 IDENTIFICATION Freq
<dbl> <fct> <chr> <dbl> <chr> <fct> <dbl> <fct> <int>
1 8455 ABERSCOL CHX 2008 12 2 1.73 ABERSCOL12NA2 5
2 8455 ABERSCOL CHX 2012 12 2 1.73 ABERSCOL12NA2 5
3 8455 ABERSCOL CHX 2014 12 2 1.73 ABERSCOL12NA2 5
4 8455 ABERSCOL CHX 2016 12 2 1.73 ABERSCOL12NA2 5
5 8455 ABERSCOL CHX 2018 12 2 1.73 ABERSCOL12NA2 5
6 8455 ABERSCOL CHS 2019 13 NA 1.79 ABERSCOL13NANA 1
7 8455 AGENCOUR CHE 2019 1 NA 2.53 AGENCOUR1NANA 1
8 8455 AGENCOUR CHX 2014 14 1 1.83 AGENCOUR14NA1 3
9 8455 AGENCOUR CHX 2016 14 1 1.83 AGENCOUR14NA1 3
10 8455 AGENCOUR CHX 2018 14 1 1.83 AGENCOUR14NA1 3

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Re: Différence de valeur suivant une variable / "SOMME.Si"

Messagepar camille garcin » 16 Juin 2020, 09:48

Il y a peut-être une solution plus élégante mais en tout cas cela fonctionne :

Code : Tout sélectionner

#IDENTIFICATION avec une seule mesure
dta_solo<-subset(dta,!IDENTIFICATION %in% unique(dta$IDENTIFICATION[duplicated(dta$IDENTIFICATION)]))

#on garde les IDENTIFICATION avec au moins deux mesures
dta<-subset(dta,IDENTIFICATION %in% unique(dta$IDENTIFICATION[duplicated(dta$IDENTIFICATION)]))


#df avec les seules mesures de la première année
dta_min<-dta[order(dta$IDENTIFICATION,dta$ANNEE),]
dta_min<-dta_min[!duplicated(dta_min$IDENTIFICATION),]
dta_min$flux0<-{-dta_min$flux0}

#df avec les seules mesures de la dernière année
dta_max<-dta[order(dta$IDENTIFICATION,-dta$ANNEE),]
dta_max<-dta_max[!duplicated(dta_max$IDENTIFICATION),]

#on regroupe
dta2<-rbind(dta_min,dta_max)

#on calcule la différence
dta_final<-aggregate(dta2[,'flux0'],list(dta2$IDENTIFICATION),sum,na.rm=T)
names(dta_final)=c('IDENTIFICATION','Delta')

> dta_final
  IDENTIFICATION Delta
1  ABERSCOL12NA2     0
2  AGENCOUR14NA1     0
CG

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Différence de valeur suivant une variable / "SOMME.Si"

Messagepar Mickael Canouil » 16 Juin 2020, 12:10

Bonjour,

pour le prochain message : Comment insérer des données dans un message ?

Voici deux solutions avec la librairie dplyr, puisque vous semblez avoir un tibble (tidyverse) :

Code : Tout sélectionner

dta <- read.table(header = TRUE, text = "AGENCE CODE_FORET ESS ANNEE PLLE `INDICE(UES)` flux0 IDENTIFICATION Freq
1 8455 ABERSCOL CHX 2008 12 2 1.73 ABERSCOL12NA2 5
2 8455 ABERSCOL CHX 2012 12 2 1.73 ABERSCOL12NA2 5
3 8455 ABERSCOL CHX 2014 12 2 1.73 ABERSCOL12NA2 5
4 8455 ABERSCOL CHX 2016 12 2 1.73 ABERSCOL12NA2 5
5 8455 ABERSCOL CHX 2018 12 2 1.73 ABERSCOL12NA2 5
6 8455 ABERSCOL CHS 2019 13 NA 1.79 ABERSCOL13NANA 1
7 8455 AGENCOUR CHE 2019 1 NA 2.53 AGENCOUR1NANA 1
8 8455 AGENCOUR CHX 2014 14 1 1.83 AGENCOUR14NA1 3
9 8455 AGENCOUR CHX 2016 14 1 1.83 AGENCOUR14NA1 3
10 8455 AGENCOUR CHX 2018 14 1 1.83 AGENCOUR14NA1 3"
)

Code : Tout sélectionner

library("dplyr") # v1.0.0
dta %>% 
  group_by
(IDENTIFICATION) %>% # group by the ids
  arrange(ANNEE) %>% # increasing order by date
  summarise( # summarise information doing the diff between last value (more recent date) and first value (oldest date)
    diff_flux0 = last(flux0) - first(flux0),
    diff_date = paste(last(ANNEE), first(ANNEE), sep = "-")
  )
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 4 x 3
#>   IDENTIFICATION diff_flux0 diff_date
#>   <chr>               <dbl> <chr>    
#> 1 ABERSCOL12NA2           0 2018-2008
#> 2 ABERSCOL13NANA          0 2019-2019
#> 3 AGENCOUR14NA1           0 2018-2014
#> 4 AGENCOUR1NANA           0 2019-2019     

Code : Tout sélectionner

dta %>% 
  group_by
(IDENTIFICATION) %>% 
  summarise
(
    diff_flux0 = flux0[which.max(ANNEE)] - flux0[which.min(ANNEE)],
    diff_date = paste(ANNEE[which.max(ANNEE)], ANNEE[which.min(ANNEE)], sep = "-")
  )
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 4 x 3
#>   IDENTIFICATION diff_flux0 diff_date
#>   <chr>               <dbl> <chr>    
#> 1 ABERSCOL12NA2           0 2018-2008
#> 2 ABERSCOL13NANA          0 2019-2019
#> 3 AGENCOUR14NA1           0 2018-2014
#> 4 AGENCOUR1NANA           0 2019-2019  


edit : une approche en R base

Code : Tout sélectionner

do.call("rbind", lapply(
  X = split(= dta, f = dta[["IDENTIFICATION"]]),
  FUN = function(idta) {
    data.frame(
      IDENTIFICATION = unique(idta[["IDENTIFICATION"]]), 
      diff_flux0 
= idta[which.max(idta[, "ANNEE"]), "flux0"] - idta[which.min(idta[, "ANNEE"]), "flux0"], 
      diff_date 
= paste(range(idta[, "ANNEE"])[c(2, 1)], collapse = "-")
    )
  }
))
#>                IDENTIFICATION diff_flux0 diff_date
#> ABERSCOL12NA2   ABERSCOL12NA2          0 2018-2008
#> ABERSCOL13NANA ABERSCOL13NANA          0 2019-2019
#> AGENCOUR14NA1   AGENCOUR14NA1          0 2018-2014
#> AGENCOUR1NANA   AGENCOUR1NANA          0 2019-2019    

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Anthony Baretti
Messages : 4
Enregistré le : 12 Juin 2020, 05:59

Re: Différence de valeur suivant une variable / "SOMME.Si"

Messagepar Anthony Baretti » 01 Juil 2020, 09:40

Merci ^^


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité