2010-10-04 40 views
2

我有來自幾所學校的學生的數據。我想表明,在每所學校通過了測試的所有學生的百分比柱狀圖,用R. 我的數據是這樣的(ID,學校,合格/不合格):使用二進制值時R中的直方圖

432342 school1通過

454233個school2失敗

543245 school1失敗

等」

(的一點是,我只是在通過學生的百分比感興趣明顯那些沒有經過都失敗了。我要爲每個顯示學生的百分比在這所學校,學校通過一列)

感謝

回答

2

有很多方法可以做到這一點。 其中之一是:

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

我在運行代碼時遇到錯誤。特別是在** aggregate **之後:'as.data.frame.default(x)中的錯誤:不能將類「公式」轉換爲data.frame' – csgillespie 2010-10-04 10:04:00

+0

適用於R-2.11.1中的我。 – Marek 2010-10-04 10:57:59

+0

@csgillespie,R 2.11.1中的聚合體改進以接受其論證的公式。這實際上是很大的改進。 – kohske 2010-10-04 11:13:58

2

我以前的答案並沒有完全解決。這是一個重做。例子是@ 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

你能解釋一下這些步驟中的每一步嗎?我不確定在哪裏創建df結尾並開始繪製圖表。 – 2016-10-08 18:54:56

+1

@TravisHeeter感謝您對此進行了檢測。除繪圖之外,我的圖形不能真正解決問題。唯一的繪圖部分是最後一行。請注意'qplot'不應該再使用,'ggplot'應該被使用,這就是爲什麼我完全重用了我的答案。 – 2016-10-09 07:06:25

+0

愛重做。感謝陌生人。 – 2016-10-09 12:51:03

0

既然你有單獨的記錄(ID),並希望基於指數(學校)來計算我建議tapply這一點。

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)