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))
Vous l'obtenez gratuitement si vous définissez correctement votre variable events
en 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 drop
name__:
R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
type quantity
1 A 3
2 B 1
3 C 0
R>
> xtabs(quantity~type, events)
type
A B C
3 1 0
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
Assez similaire à la réponse de @ DWin:
> aggregate(quantity~type, events, FUN=sum)
type quantity
1 A 3
2 B 1
3 C 0