2015-04-18 27 views
-1

我有一個dataframe列出studentnumber <- c(1,2,3.. nth)schoolnumber<- c(1,1,2,3,4,4)所以瞳孔1是在學校1所,學生2是在學校1所,學生3是在學校3 ....如何通過學校創建平均ses - tapply函數錯誤?

我會爲每個學生和我社會經濟地位想要計算一個新的列,其中SES是實際SES減去特定學校的平均SES。這個功能顯然是:

mydata$meansocialeconomicstatus <- with(mydata, tapply(ses, schoolnumber, mean)) 

但是我收到一個錯誤詞,是因爲新列不重複取決於如果學校數量已經重複每個值。所以這給了我新的列中不匹配數據框的行數的差異。這是因爲每個手段只給予一次。

我的問題是,我可以添加什麼以使平均次數在新列中重複取決於學號?

+0

'with(mydata,ave(ses,schoolnumber,FUN = mean))'? – lukeA

+0

有50個或更多的警告(使用警告()看到第一個50):( – Rachel

回答

1

您可以使用dplyr包。

library(dplyr) 

# Calculate the mean socialeconomicstatus per schoolnumber. 
mydata2 <- mydata %>% 
      group_by(schoolnumber) %>% 
      summarise(meansocialeconomicstatus = mean(ses)) 

# Join the mean socialeconomicstatus back to the original dataset based on schoolnumber. 
left_join(mydata,mydata2,by="schoolnumber") 
+0

我有同樣的問題,在這個地方它不會加入他們在一起,因爲一個有很多比其他水平 – Rachel

+0

你嘗試確切數據幀的大小不必相同,例如運行'left_join(iris,iris [1,],by =「Species」)'。如果你希望得到更具體的幫助,請發佈一個可重現的例子。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – JT85

+0

雙重檢查我是如何編碼的 - 我誤了left_join - 現在它的工作!輝煌。謝謝你! – Rachel