我有一個包括一大堆關於學生,包括他們現在的學校,故居的郵政編碼數據的數據集,和比分:執行多個彙總函數,並返回一個數據幀
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
嗎?我是新手。
從這裏看起來不錯。 –
你在代碼中有錯誤。空(.data)中的錯誤:未找到對象'schools' –
您確定要將分割變量(「ddply」的第二個參數)設置爲「zip」嗎? 'length(unique(zip))'不會總是返回'1'嗎? – rrs