Je veux calculer la fréquence des modalités en fonction des espèces trouvées.
Voici le bloc de données, et je veux compter le nombre de chaque type _gite et compter ceux où seulement aegypti a été trouvé, seulement ceux où albo ont été trouvés et mélangés où les deux ont été trouvés ensemble.
type gite aegypti albopictus mixed total recipient_abandonne 2 0 0 2 recipient stockage 3 1 1 5 autres 0 2 0 2 total 5 3 1 9
Voici comment il devrait ressembler à:
type_gite aegypti albopictus total recipient_abandonne 19 0 19 recipient_stockage 0 2 2 recipient_stockage 8 0 8 recipient_stockage 36 0 36 recipient_stockage 13 0 13 recipient_stockage 1 3 4 autres 0 1 1 autres 0 9 9 recipient_abandonne 3 0 3
Quel code ou quelle formule d'agrégation convient le mieux?
3 Réponses :
Je pense que vous cherchez quelque chose comme ça. J'ai pris des données factices aléatoires comme exemple.
library(dplyr)
# Create dummy data
df <- data.frame(matrix(rnorm(10), ncol = 2))
df <- cbind(c("blah", "blah", "meh", "meh", "meh"), df)
colnames(df) <- c("grouping_variable", "some_var", "some_other_var")
# Group by 1 variable & summarise on rest
df %>% group_by(grouping_variable) %>% summarise_all(sum)
Merci pour votre solution, mais c'est similaire à ce que je recherche, pas exactement le point.
Pour votre bloc de données par exemple, vous devez enregistrer l'occurrence de la "variable_groupage". Le code ci-dessus ne correspond pas exactement à mes données
Voici ce que j'ai trouvé:
#create data
df = data.frame(type_gite = c('recipient_abandonne', 'recipient_stockage', 'recipient_stockage',
'recipient_stockage', 'recipient_stockage', 'recipient_stockage', 'autres', 'autres',
'recipient_abandonne'),
aegyti_collected = c(19, 0, 8, 36,13,1,0,0,3),
albopictus_collected = c(0,2,0,0,0,3,1,9,0),
total_collected = c(19,2,8,36,13,4,1,9,3))
#Classify as Mixed or only one of species using case when
df$label = case_when(df$albopictus_collected == 0 ~ 'Aegyti Only',
df$aegyti_collected == 0 ~ 'Albopictus Only',
TRUE ~'Mixed')
#frequency table
df = data.frame(rbind(table(df$type_gite, df$label)))
#add column title back in
df = df %>% tibble::rownames_to_column(var = 'type_gite')
#create total column
library(janitor)
df = df %>% adorn_totals("col")
Vous avez également besoin d'un total pour chaque colonne, donc à la fin, faites df = df%>% adorn_totals ("row")
Vous pouvez utiliser dplyr et janitor (pour obtenir la ligne Total ) pour obtenir ce dont vous avez besoin:
df1 <- structure(list(type_gite = structure(c(2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 2L),
.Label = c("autres", "recipient_abandonne", "recipient_stockage"),
class = "factor"),
aegyti_collected = c(19, 0, 8, 36, 13, 1, 0, 0, 3),
albopictus_collected = c(0, 2, 0, 0, 0, 3, 1, 9, 0),
total_collected = c(19, 2, 8, 36, 13, 4, 1, 9, 3)),
class = "data.frame", row.names = c(NA, -9L))
Merci pour votre réponse, mais le code a un problème car il donne un message d'erreur "Erreur dans select (., -Total): argument non utilisé (-total)". Je n'en connais pas le sens. Pouvez-vous nous fournir une explication? Merci encore.
@ArmelTedjou Je soupçonne que vous n'avez pas réellement de colonne total et c'est quelque chose que vous avez ajouté à la question à titre d'illustration. select (-total) supprime simplement cette colonne de notre sortie, donc si vous n'avez pas réellement cette colonne, débarrassez-vous de select (-total)%>% ceci tuyauterie et cela fonctionnera pour vous. De plus, les noms de colonnes doivent correspondre à votre ensemble de données réel! Donc, si vous avez cette colonne et qu'elle s'appelle total_collected , utilisez simplement cela au lieu de total .