2010-10-04 41 views
2

J'ai des données d'étudiants de plusieurs écoles. Je veux montrer un histogramme du pourcentage de tous les élèves qui ont réussi le test dans chaque école, en utilisant R. Mes données ressemble à ceci (id, école, passé/échec):Histogramme en R lors de l'utilisation d'une valeur binaire

432342 école1 passé

454233 School2 a échoué

543245 école1 n'a pas

etc »

(le point est que je ne suis intéressé par le pour cent des étudiants qui ont passé, évidemment ceux qui ne sont pas transmises ont échoué. Je veulent avoir une colonne pour chaque école qui montre le pour cent des élèves dans cette école qui a passé)

Merci

Répondre

2

il y a beaucoup de façons de le faire. on est:

df<-data.frame(ID=sample(100), 
school=factor(sample(3,100,TRUE),labels=c("School1","School2","School3")), 
result=factor(sample(2,100,TRUE),labels=c("passed","failed"))) 

p<-aggregate(df$result=="passed"~school, mean, data=df) 
barplot(p[,2]*100,names.arg=p[,1]) 
+0

Je reçois une erreur lorsque j'exécute votre code. En particulier, après ** aggregate **: 'Erreur dans as.data.frame.default (x): ne peut pas forcer la classe" formula "dans un data.frame' – csgillespie

+0

Fonctionne pour moi dans R-2.11.1. – Marek

+0

@csgillespie, l'agrégat est amélioré dans R 2.11.1 pour accepter la formule pour son argument. C'est en fait une grande amélioration. – kohske

2

Ma réponse précédente ne va pas tout le chemin. Voici un refaire. L'exemple est celui de la réponse de @ eyjo.

students <- 400 
schools <- 5 

df <- data.frame(
    id = 1:students, 
    school = sample(paste("school", 1:schools, sep = ""), size = students, replace = TRUE), 
    results = sample(c("passed", "failed"), size = students, replace = TRUE, prob = c(.8, .2))) 

r <- aggregate(results ~ school, FUN = table, data = df) 
r <- do.call(cbind, r) # "flatten" the result 
r <- as.data.frame(cbind(r, sum = rowSums(r))) 

r$perc.passed <- round(with(r, (passed/sum) * 100), 0) 

library(ggplot2) 

ggplot(r, aes(x = school, y = perc.passed)) + 
    theme_bw() + 
    geom_bar(stat = "identity") 

enter image description here

+0

Pourriez-vous expliquer chacune de ces étapes? Je ne suis pas sûr où créer la fin df et formuler le graphique commence. –

+1

@TravisHeeter merci de ping cette. Mon graphique ne résout pas vraiment le problème autre que le traçage. La seule partie de tracé est la dernière ligne. Notez que 'qplot' ne devrait plus être utilisé et' ggplot' devrait être utilisé, c'est pourquoi j'ai totalement refait ma réponse. –

+0

Aimer le refaire. Merci gentil étranger. –

0

Puisque vous avez des enregistrements individuels (id) et je vous suggère voulez calculer fonction de l'indice (école) tapply pour cela.

students <- 400 
schools <- 5 

df <- data.frame("id" = 1:students, 
    "school" = sample(paste("school", 1:schools, sep = ""), 
     size = students, replace = TRUE), 
    "results" = sample(c("passed", "failed"), 
     size = students, replace = TRUE, prob = c(.8, .2))) 

p <- tapply(df$results == "passed", df$school, mean) * 100 

barplot(p)