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))
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>
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
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