web-dev-qa-db-fra.com

Compter les occurrences du facteur dans R, avec zéro comptage signalé

Je veux compter le nombre d'occurrences d'un facteur dans une trame de données. Par exemple, pour compter le nombre d’événements d’un type donné dans le code ci-dessous:

library(plyr)
events <- data.frame(type = c('A', 'A', 'B'),
                       quantity = c(1, 2, 1))
ddply(events, .(type), summarise, quantity = sum(quantity))

La sortie est la suivante:

     type quantity
1    A        3
2    B        1

Cependant, que se passe-t-il si je sais qu'il existe trois types d'événements A, B et C et que je souhaite également voir le nombre pour C qui est 0? En d'autres termes, je veux que le résultat soit:

     type quantity
1    A        3
2    B        1
3    C        0

Comment puis-je faire cela? C'est comme si une fonction devait être définie pour le faire quelque part.

Voici mes deux idées pas très bonnes sur la façon de procéder.

Idée n ° 1: Je sais que je pourrais le faire en utilisant une boucle for, mais je sais que l’on dit généralement que si vous utilisez une boucle for dans R, vous faites quelque chose de mal, il doit y avoir un meilleur moyen de le faire.

Idée n ° 2: Ajoutez des entrées factices au bloc de données d'origine. Cette solution fonctionne mais il semble qu'il devrait y avoir une solution plus élégante.

events <- data.frame(type = c('A', 'A', 'B'),
                       quantity = c(1, 2, 1))
events <- rbind(events, data.frame(type = 'C', quantity = 0))
ddply(events, .(type), summarise, quantity = sum(quantity))
11
I Like to Code

Vous l'obtenez gratuitement si vous définissez correctement votre variable eventsen tant que facteur avec les trois niveaux souhaités:

R> events <- data.frame(type = factor(c('A', 'A', 'B'), c('A','B','C')), 
+                       quantity = c(1, 2, 1))
R> events
  type quantity
1    A        1
2    A        2
3    B        1
R> table(events$type)

A B C 
2 1 0 
R> 

Appeler simplement table() sur le facteur fait déjà le bon choix, et ddply() peut aussi Si vous ne lui dites pas dropname__:

R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
  type quantity
1    A        3
2    B        1
3    C        0
R> 
20
Dirk Eddelbuettel
> xtabs(quantity~type, events)
type
A B C 
3 1 0 
4
42-

Utiliser la bibliothèque dplyr

library(dplyr)
data <- data.frame(level = c('A', 'A', 'B', 'B', 'B', 'C'),
                   value = c(1:6))

data %>%
  group_by(level) %>%
  summarize(count = n()) %>%
  View

Si vous choisissez également d'effectuer des opérations moyennes, minimales, maximales, essayez ceci.

data %>%
  group_by(level) %>%
  summarise(count = n(), Max_val = max(value), Min_val = min(value)) %>%
  View
2
krish9988

Assez similaire à la réponse de @ DWin:

> aggregate(quantity~type, events, FUN=sum)
  type quantity
1    A        3
2    B        1
3    C        0
0
Matthew Lundberg