Somme des valeurs d'une colonne pour chaque lignes identiques.

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

Roux Adrien
Messages : 3
Enregistré le : 08 Avr 2017, 10:15

Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Roux Adrien » 10 Avr 2017, 16:38

Bonjours,

Je suis débutant sur R (maîtrise de quelques bases) et je voulais savoir comment je peux faire pour avoir une somme des graines (types de graines par types de graines) mangées par les mésange charbonnière par exemple.
Image

Je dois comparer les proportions de graines choisies par les espèces d'oiseaux aux proportions attendues dans un cas d'équiprobabilité (chisq.test). Pour cela j'ai donc besoin de faire la somme des graines mangées par espèces, par type de graines...

Est-ce que vous pourriez m'aider ?
Merci. :)

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Serge Rapenne » 10 Avr 2017, 16:59

Bonjour,

cf les fonction de base tapply,by ou aggragate ou la fonction group_by du package dplyr.

Merci de lire : viewtopic.php?f=1&t=7638 et viewtopic.php?f=1&t=3302

Serge

Roux Adrien
Messages : 3
Enregistré le : 08 Avr 2017, 10:15

Re: Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Roux Adrien » 10 Avr 2017, 18:38

Merci pour la réponse rapide,
Donc un cas simplifier comme celui ci, je ne sais pas comment faire la somme de "graine 1" et "graine 2" en même pour chaque espèces "M"
J'ai déjà utilisé ces fonctions auparavant, mais j'ignore comment faire rentrer trois "vecteurs" (espece"M",graine1,graine2) dans une formule...

Code : Tout sélectionner

z <- structure(list(x = c("M","C","D","M","D","C","M","M","C","D"), y = c(1,0,1,0,0,1,2,1,2,4), z = c(2,3,1,4,2,3,5,0,1,0)), .Names = c("espece","graine1","graine2"), row.names = c(NA, -10L), class = "data.frame")
z


Adrien

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Serge Rapenne » 10 Avr 2017, 20:17

3 solutions parmi d'autres.

uniquement avec les fonctions de base de R

Code : Tout sélectionner

apply(z[,-1],2,tapply,z$espece,sum)
  graine1 graine2
C       3       7
D       5       3
M       4      11

avec le package dplyr

Code : Tout sélectionner

library(dplyr)

z %>% group_by(espece) %>% summarise_if(is.numeric,sum)
# A tibble: 3 × 3
  espece graine1 graine2
   <chr>   <dbl>   <dbl>
1      C       3       7
2      D       5       3
3      M       4      11

avec les packages dplyr et tidyr

Code : Tout sélectionner

library(dplyr)
library(tidyr)
z%>% gather(type_graine,nb_graine,-espece)%>% group_by(espece,type_graine) %>% summarise(total_graine=sum(nb_graine) )

Source: local data frame [6 x 3]
Groups: espece [?]

  espece type_graine total_graine
   <chr>       <chr>        <dbl>
1      C     graine1            3
2      C     graine2            7
3      D     graine1            5
4      D     graine2            3
5      M     graine1            4
6      M     graine2           11


Personnellement j'ai une préférence pour les solutions avec dplyr qui me semblent plus lisibles mais ça n'engage que moi. Parmi les deux solutions avec dplyr, la solution utilisant tidyr a ma préférence car elle a une sortie au format long que je trouve plus pratique à manipuler notamment pour faire des graphiques avec ggplot2 à la suite.

Serge

Roux Adrien
Messages : 3
Enregistré le : 08 Avr 2017, 10:15

Re: Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Roux Adrien » 11 Avr 2017, 13:04

Merci beaucoup !! j'ai choisi apply, les résultats sont mieux présentés (plus simple) et la ligne de code est propre.

Encore merci pour la rapidité des réponses !

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

Re: Somme des valeurs d'une colonne pour chaque lignes identiques.

Messagepar Logez Maxime » 11 Avr 2017, 13:56

Bonjour,

pour une somme en ligne avec un groupe la fonction la plus efficace reste rowsum :

Code : Tout sélectionner

rowsum(z[-1], z$espece)
  graine1 graine2
C       3       7
D       5       3
M       4      11

microbenchmark(apply(z[-1], 2, tapply, z$espece, sum), rowsum(z[-1], z$espece))
Unit: microseconds
                                   expr     min       lq      mean   median       uq      max neval
 apply(z[-1], 2, tapply, z$espece, sum) 292.236 304.8840 353.55573 319.9865 362.4625 1022.445   100
                rowsum(z[-1], z$espece)  33.981  40.0225  48.74414  47.3845  50.2165  134.036   100
Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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