aggregate mais sans créer de nouveau dataframe

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

Guarinos Nicolas
Messages : 10
Enregistré le : 25 Mai 2020, 14:52

aggregate mais sans créer de nouveau dataframe

Messagepar Guarinos Nicolas » 05 Juil 2020, 10:32

Bonjour,
Pardon pour le titre un peu confus. Je m'explique.
Mon code est le suivant :

Code : Tout sélectionner

> a=c(1,2,3,4,5,6,7)
> b=c("A","A","A","B","B","B","C")
> c=c(1,3,0,1,2,2,3)
> df=cbind(a,b,c)
> df
     a   b   c 
[1,] "1" "A" "1"
[2,] "2" "A" "3"
[3,] "3" "A" "0"
[4,] "4" "B" "1"
[5,] "5" "B" "2"
[6,] "6" "B" "2"
[7,] "7" "C" "3"


J'aimerais créer une 4 colonne qui calcule automatiquement la somme sur c par groupes, où les groupes seraient donnés par b. En clair, cette colonne aurait comme tête : 4, 5, 3.
Je sais que je pourrais utiliser aggregate qui me créerait un nouveau dataframe et que je pourrais ensuite fusionner ce nouveau dataframe avec df pour obtenir cette colonne, mais serait-il possible de le faire en une ligne de code, sans passer par un nouveau dataframe ? merci d'avance

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

Re: aggregate mais sans créer de nouveau dataframe

Messagepar Mickael Canouil » 05 Juil 2020, 16:51

Bonjour,

je ne comprends pas ce que veut dire "une ligne de code" ou encore "nouveau data.frame".
Quel est le problème d'un aggregate et merge au juste ?

Code : Tout sélectionner

df <- data.frame(
  a = c(1, 2, 3, 4, 5, 6, 7),
  b = c("A", "A", "A", "B", "B", "B", "C"),
  c = c(1, 3, 0, 1, 2, 2, 3)
)

merge(df, aggregate(df$c, list(df$b), sum), by.= "b", by.="Group.1")
#>   b a c x
#> 1 A 1 1 4
#> 2 A 2 3 4
#> 3 A 3 0 4
#> 4 B 4 1 5
#> 5 B 5 2 5
#> 6 B 6 2 5
#> 7 C 7 3 3   

Version tidyverse (en "plusieurs lignes de code")

Code : Tout sélectionner

library(dplyr)
df <- data.frame(
  a = c(1, 2, 3, 4, 5, 6, 7),
  b = c("A", "A", "A", "B", "B", "B", "C"),
  c = c(1, 3, 0, 1, 2, 2, 3)
)
df %>% 
  group_by
(b) %>% 
  mutate
(= sum(c)) %>% 
  ungroup
()
#> # A tibble: 7 x 4
#>       a b         c     x
#>   <dbl> <chr> <dbl> <dbl>
#> 1     1 A         1     4
#> 2     2 A         3     4
#> 3     3 A         0     4
#> 4     4 B         1     5
#> 5     5 B         2     5
#> 6     6 B         2     5
#> 7     7 C         3     3   

Notez que dans tous les cas, une affectation est nécessaire.

Cordialement,
Mickaël

Logez Maxime
Messages : 3012
Enregistré le : 26 Sep 2006, 11:35

Re: aggregate mais sans créer de nouveau dataframe

Messagepar Logez Maxime » 06 Juil 2020, 07:38

Bonjour,

Une solution de "base" :

Code : Tout sélectionner

df$d <- ave(df$c, df$b, FUN = sum)

Cordialement,
Maxime

Guarinos Nicolas
Messages : 10
Enregistré le : 25 Mai 2020, 14:52

Re: aggregate mais sans créer de nouveau dataframe

Messagepar Guarinos Nicolas » 06 Juil 2020, 08:51

Merci beaucoup pour vos réponses, vos solutions me conviennent !!!


Retourner vers « Questions en cours »

Qui est en ligne

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