How do I get the coefficient of variation of a group of observations with R?

Viewed 22

I'm new to coding so it may be kind of a stupid question. The thing is, I have this data frame of centrum length in diffrent species for each vertebrae, and for a homework I have to find the cv of the centrum length for each species, and I could do it manually but of course it'll take a long time so I figured that there must be a way to do it with code. I already did a boxplot of the data so I have an idea of which species could have a bigger cv than others, but still I need the specific values. I'll leave at the end the data frame so you get an idea of it's structure and I'll also attach the graph and the code just in case. Thx in advance.

library(ggplot2)

ggplot(comp.lc, aes( centrum_length, y=Species)) + 
  geom_boxplot(fill = "#e0f3db", color = "#43a2ca") + 
  labs(title= "Tamaño de la centra en diferentes especies de tetrapodos", x="Largo de la centra", y= "Especies") + theme(legend.position = "none") + 
  stat_summary(fun=mean, geom="point", shape=20, size=2, color="#2ca25f", fill="#2ca25f")

centrum length in different tetrapod species

Data frame in dput format:

structure(list(species = c("Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alligator_missippiensis", 
"Alligator_missippiensis", "Alligator_missippiensis", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Alouatta_palliata", "Alouatta_palliata", "Alouatta_palliata", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Antilocapra_americana", "Antilocapra_americana", "Antilocapra_americana", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Castor_canadensis", "Castor_canadensis", "Castor_canadensis", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", "Corucia_zebrata", 
"Corucia_zebrata", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Didelphis_virginiana", 
"Didelphis_virginiana", "Didelphis_virginiana", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Equus_caballus", "Equus_caballus", "Equus_caballus", "Equus_caballus", 
"Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", 
"Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", 
"Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", 
"Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", 
"Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", "Felis_catus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Lepus_americanus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Lepus_americanus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Lepus_americanus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Lepus_americanus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Lepus_americanus", 
"Lepus_americanus", "Lepus_americanus", "Lepus_americanus", "Sus scrofa", 
"Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", 
"Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", 
"Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", 
"Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", "Sus scrofa", 
"Sus scrofa", "Sus scrofa", "Sus scrofa", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tamandua_tetradactyla", "Tamandua_tetradactyla", "Tamandua_tetradactyla", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", "Tapirus_bairdii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Zaglossus_bruijnii", "Zaglossus_bruijnii", 
"Zaglossus_bruijnii", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng", 
"Varanus_beng", "Varanus_beng", "Varanus_beng", "Varanus_beng"
), vertebrae_number = c(3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 
20L, 21L, 22L, 23L, 24L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 
23L, 24L, 25L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
25L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 
27L, 28L, 29L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
25L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 21L, 22L, 23L, 24L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 
23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
22L, 23L, 24L, 25L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
24L, 25L, 26L, 27L), centrum_length = c(22.38, 22.1, 22.29, 21.235, 
21.13, 20.57, 21.255, 22.42, 24.19, 27.54, 27.95, 27.45, 26.855, 
27.475, 28.545, 28.97, 30.255, 28.895, 29.14, 28.02, 26.06, 24.565, 
9.82, 10.515, 9.935, 10.04, 9.97, 10.33, 10.5, 10.735, 11.335, 
11.495, 11.285, 12, 11.165, 12.96, 12.035, 14.14, 13.16, 14.885, 
15.585, 17.41, 20.06, 20.735, 21.185, 21.78, 20.235, 56.015, 
53.505, 44.355, 38.3, 29.6, 25.795, 25.32, 26.44, 26.525, 25.78, 
25.415, 25.24, 24.62, 25.25, 26.865, 27.815, 30.495, 32.465, 
33.13, 33.36, 33.76, 33.425, 34.55, 30.55, 7.8235, 8.228, 7.5045, 
6.9675, 8.039, 9.4845, 10.374, 10.964, 11.829, 11.4645, 11.915, 
12.6985, 13.0175, 14.1775, 14.9935, 15.0685, 15.6245, 16.853, 
17.0555, 18.2435, 19.9365, 21.3335, 20.754, 21.5395, 3.3927, 
3.6469, 3.5384, 4.1881, 4.2201, 5.1543, 4.914, 6.2748, 6.2357, 
6.6088, 6.5692, 7.2566, 7.3505, 7.7192, 7.3962, 8.19, 7.634, 
7.7893, 7.6848, 8.0341, 7.7616, 8.015, 7.535, 7.0289, 6.3422, 
8.25, 7.245, 7.215, 7, 7.01, 7.335, 7.665, 8.035, 8.66, 8.305, 
8.37, 8.535, 8.94, 9.32, 9.63, 10.17, 9.88, 9.96, 10.185, 12.24, 
14.05, 14.98, 14.36, 14.89, 13.455, 96.66, 93.98, 93.125, 85.975, 
57.11, 43.39, 41.205, 41.56, 43.015, 43.535, 38.815, 38.625, 
40.155, 39.015, 39.265, 38.91, 41.08, 39.76, 39.35, 40.28, 40.84, 
42.305, 44.44, 45.965, 47.495, 46.22, 49.325, 49.245, 50.805, 
11.68, 11.2, 10.3, 10.41, 9.56, 8.93, 7.83, 8.44, 8.72, 8.67, 
9.31, 9.53, 9.96, 10.25, 10.7, 11.23, 10.76, 12.05, 13.29, 15.36, 
16.8, 18.91, 19.64, 19.84, 14.94, 9.897, 9.6255, 8.0945, 7.2585, 
6.2305, 5.9695, 6.727, 7.3455, 8.251, 8.048, 8.8605, 9.266, 10.682, 
11.473, 12.5665, 14.5595, 16.265, 17.0525, 18.054, 18.9225, 18.3175, 
18.418, 14.614, 31.47, 28.57, 29.08, 27.96, 28.84, 33.295, 32.005, 
31.005, 30.595, 29.69, 29.805, 30.335, 31.265, 31.88, 32.955, 
32.855, 34.825, 35.975, 39.405, 41.455, 41.685, 42.125, 45.22, 
41.79, 10.877, 10.8915, 11.168, 11.925, 10.9205, 12.3015, 12.13, 
11.885, 11.4285, 11.5525, 11.469, 11.2115, 11.751, 11.729, 12.2935, 
11.893, 11.767, 12.4635, 13.3895, 12.812, 13.51, 13.5515, 13.094, 
14.0795, 14.1375, 37.925, 36.37, 33.14, 30.535, 30.62, 33.005, 
31.045, 31.595, 28.925, 29.29, 30.75, 31.655, 32.305, 31.97, 
31.885, 32.275, 32.76, 32.315, 32.385, 31.9, 35.505, 33.485, 
34.94, 35.925, 35.63, 35.895, 35.735, 37.47, 12.825, 12.73, 13.465, 
11.47, 11.825, 10.36, 11.46, 11.195, 10.83, 8.995, 10.05, 9.83, 
10.87, 10.5, 9.845, 9.725, 11.035, 11.095, 10.76, 10.935, 11.385, 
11.675, 12.485, 12.25, 11.67, 10.31, 11.025, 11.24, 11.405, 11.015, 
10.565, 9.965, 9.81, 9.225, 9.365, 9.14, 9.61, 8.87, 9.3, 9.21, 
9.51, 9.62, 9.315, 9.84, 9.19, 10.12, 9.2, 9.695, 9.33, 9.22, 
9.315, 9.105)), class = "data.frame", row.names = c(NA, -351L
))
1 Answers

There already are question on how to compute summary statistics by group in R, see here, . In this case define a function cv and call it in any of the following ways.

Base R

The difference between the solutions below is the output format.

cv <- function(x, na.rm = FALSE)  sd(x, na.rm = na.rm)/mean(x, na.rm = na.rm)

aggregate(centrum_length ~ species, comp.lc, cv)
#>                    species centrum_length
#> 1  Alligator_missippiensis     0.12680122
#> 2        Alouatta_palliata     0.29697942
#> 3    Antilocapra_americana     0.26626589
#> 4        Castor_canadensis     0.33889613
#> 5          Corucia_zebrata     0.24594249
#> 6     Didelphis_virginiana     0.26629969
#> 7           Equus_caballus     0.35649279
#> 8              Felis_catus     0.30116526
#> 9         Lepus_americanus     0.38381457
#> 10              Sus scrofa     0.15220894
#> 11   Tamandua_tetradactyla     0.08054581
#> 12         Tapirus_bairdii     0.07282978
#> 13            Varanus_beng     0.07351440
#> 14      Zaglossus_bruijnii     0.09612595

by(comp.lc$centrum_length, comp.lc$species, cv)
#> comp.lc$species: Alligator_missippiensis
#> [1] 0.1268012
#> ------------------------------------------------------------ 
#> comp.lc$species: Alouatta_palliata
#> [1] 0.2969794
#> ------------------------------------------------------------ 
#> comp.lc$species: Antilocapra_americana
#> [1] 0.2662659
#> ------------------------------------------------------------ 
#> comp.lc$species: Castor_canadensis
#> [1] 0.3388961
#> ------------------------------------------------------------ 
#> comp.lc$species: Corucia_zebrata
#> [1] 0.2459425
#> ------------------------------------------------------------ 
#> comp.lc$species: Didelphis_virginiana
#> [1] 0.2662997
#> ------------------------------------------------------------ 
#> comp.lc$species: Equus_caballus
#> [1] 0.3564928
#> ------------------------------------------------------------ 
#> comp.lc$species: Felis_catus
#> [1] 0.3011653
#> ------------------------------------------------------------ 
#> comp.lc$species: Lepus_americanus
#> [1] 0.3838146
#> ------------------------------------------------------------ 
#> comp.lc$species: Sus scrofa
#> [1] 0.1522089
#> ------------------------------------------------------------ 
#> comp.lc$species: Tamandua_tetradactyla
#> [1] 0.08054581
#> ------------------------------------------------------------ 
#> comp.lc$species: Tapirus_bairdii
#> [1] 0.07282978
#> ------------------------------------------------------------ 
#> comp.lc$species: Varanus_beng
#> [1] 0.0735144
#> ------------------------------------------------------------ 
#> comp.lc$species: Zaglossus_bruijnii
#> [1] 0.09612595

with(comp.lc, tapply(centrum_length, species, cv))
#> Alligator_missippiensis       Alouatta_palliata   Antilocapra_americana 
#>              0.12680122              0.29697942              0.26626589 
#>       Castor_canadensis         Corucia_zebrata    Didelphis_virginiana 
#>              0.33889613              0.24594249              0.26629969 
#>          Equus_caballus             Felis_catus        Lepus_americanus 
#>              0.35649279              0.30116526              0.38381457 
#>              Sus scrofa   Tamandua_tetradactyla         Tapirus_bairdii 
#>              0.15220894              0.08054581              0.07282978 
#>            Varanus_beng      Zaglossus_bruijnii 
#>              0.07351440              0.09612595

Created on 2022-09-22 with reprex v2.0.2


dplyr solution.

suppressPackageStartupMessages(
  library(dplyr)
)

cv <- function(x, na.rm = FALSE)  sd(x, na.rm = na.rm)/mean(x, na.rm = na.rm)

comp.lc %>%
  group_by(species) %>%
  summarise(cv = cv(centrum_length))
#> # A tibble: 14 × 2
#>    species                     cv
#>    <chr>                    <dbl>
#>  1 Alligator_missippiensis 0.127 
#>  2 Alouatta_palliata       0.297 
#>  3 Antilocapra_americana   0.266 
#>  4 Castor_canadensis       0.339 
#>  5 Corucia_zebrata         0.246 
#>  6 Didelphis_virginiana    0.266 
#>  7 Equus_caballus          0.356 
#>  8 Felis_catus             0.301 
#>  9 Lepus_americanus        0.384 
#> 10 Sus scrofa              0.152 
#> 11 Tamandua_tetradactyla   0.0805
#> 12 Tapirus_bairdii         0.0728
#> 13 Varanus_beng            0.0735
#> 14 Zaglossus_bruijnii      0.0961

Created on 2022-09-22 with reprex v2.0.2

Related