Compter les occurrences de facteur dans R, avec zéro compte signalé

je veux compter le nombre d'occurrences d'un élément 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))

le résultat est Le suivant:

     type quantity
1    A        3
2    B        1

Cependant, si je sais qu'il y a trois types d'événements A,B et C et je veux aussi voir le comte de C qui est <!--8? En d'autres termes, je veux la sortie:

     type quantity
1    A        3
2    B        1
3    C        0

Comment dois-je faire? Il on dirait qu'il devrait y avoir une fonction définie pour faire ça quelque part.

voici mes deux idées pas si bonnes sur la façon de procéder.

Idée #1: je sais que je pourrais le faire en utilisant un for boucle, mais je sais qu'il est communément dit que si vous utilisez un for boucle R, alors vous faites quelque chose de mal, il doit y avoir une meilleure façon de le faire.

idée #2: ajouter des entrées fictives aux données originales cadre. 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
demandé sur I Like to Code 2013-04-18 07:21:18

4 réponses

Vous recevez ce gratuitement, si vous définissez votre events variable correctement comme un facteur avec les trois niveaux:

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> 

simplement appeler table() sur le facteur déjà fait la bonne chose, et ddply() est-ce trop si vous lui dites de ne pas drop:

R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
  type quantity
1    A        3
2    B        1
3    C        0
R> 
20
répondu Dirk Eddelbuettel 2013-04-18 03:29:56
> xtabs(quantity~type, events)
type
A B C 
3 1 0 
4
répondu 42- 2013-04-18 03:41:19

utilisation de 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 aussi d'effectuer des opérations mean, min, max, essayez ceci

data %>%
  group_by(level) %>%
  summarise(count = n(), Max_val = max(value), Min_val = min(value)) %>%
  View
2
répondu krish9988 2017-10-11 08:08:03

tout à fait similaire à la réponse de @DWin:

> aggregate(quantity~type, events, FUN=sum)
  type quantity
1    A        3
2    B        1
3    C        0
0
répondu Matthew Lundberg 2013-04-18 03:45:12