2014-01-16 132 views
2

我有一個包括一大堆關於學生,包括他們現在的學校,故居的郵政編碼數據的數據集,和比分:執行多個彙總函數,並返回一個數據幀

students <- read.table(text = "zip school score 
       43050 'Hunter' 202.72974236 
       48227 'NYU' 338.49571519 
       48227 'NYU' 223.48658339 
       32566 'CCNY' 310.40666224 
       78596 'Columbia' 821.59318662 
       78045 'Columbia' 853.09842034 
       60651 'Lang' 277.48624384 
       32566 'Lang' 315.49753763 
       32566 'Lang' 80.296556533 
       94941 'LIU' 373.53839238 
       ",header = TRUE,sep = "") 

我想關於它的彙總數據堆,每個學校。數據集中每所學校有多少名學生,每所學校有多少獨特的郵編,平均分和累積分。我知道我可以通過使用tapply創造了一堆tmp幀得到這樣的:

tmp.mean <- data.frame(tapply(students$score, students$school, mean)) 
tmp.sum <- data.frame(tapply(students$score, students$school, sum)) 
tmp.unique.zip <- data.frame(tapply(students$zip, students$school, function(x) length(unique(x)))) 
tmp.count <- data.frame(tapply(students$zip, students$school, function(x) length(x))) 

給他們更好的列名:

colnames(tmp.unique.zip) <- c("Unique zips") 
colnames(tmp.count) <- c("Count") 
colnames(tmp.mean) <- c("Mean Score") 
colnames(tmp.sum) <- c("Total Score") 

而且使用cbind到再次綁在一起,他們都:

school.stats <- cbind(tmp.mean, tmp.sum, tmp.unique.zip, tmp.count) 

我認爲更簡單的方法是:

library(plyr) 
school.stats <- ddply(students, .(school), summarise, 
        record.count=length(score), 
        unique.r.zips=length(unique(zip)), 
        mean.dist=mean(score), 
        total.dist=sum(score) 
) 

由此產生的數據看起來差不多(實際上,ddply方法更清潔,包括學校作爲列而不是行名稱)。有兩個問題:有沒有更好的方法來找出每個學校有多少記錄?而且,我在這裏有效使用ddply嗎?我是新手。

+1

從這裏看起來不錯。 –

+0

你在代碼中有錯誤。空(.data)中的錯誤:未找到對象'schools' –

+0

您確定要將分割變量(「ddply」的第二個參數)設置爲「zip」嗎? 'length(unique(zip))'不會總是返回'1'嗎? – rrs

回答

0

評論似乎是普遍同意:這個不錯。

3

如果性能是一個問題,你也可以使用data.table

require(data.table) 
tab_s<-data.table(students) 
setkey(tab_s,school) 
tab_s[,list(total=sum(score), 
     avg=mean(score), 
     unique.zips=length(unique(zip)), 
     records=length(score)), 
    by="school"] 

    school  total  avg unique.zips records 
1: Hunter 202.7297 202.7297   1  1 
2:  NYU 561.9823 280.9911   1  2 
3:  CCNY 310.4067 310.4067   1  1 
4: Columbia 1674.6916 837.3458   2  2 
5:  Lang 673.2803 224.4268   2  3 
6:  LIU 373.5384 373.5384   1  1 
+1

使用't'作爲對象名稱是不明智的,因爲在讀取代碼時它可能與函數't'很容易混淆。 – Roland

+0

好點。糾正! – Troy

相關問題