[英]Tabulating school grades with data.table (long form to wide form)
我有一個很大的課程分數和學生ID。 它看起來像這樣(有更多的變量被刪除以簡化):
studentID course grade
--------------------------------
1 chemistry 86
2 chemistry 85
2 math 72
3 english 52
3 math 90
...
我需要將該大文件轉換為一個文件,其中每個學生的行都包含所有不同課程的成績。 更像這樣的東西:
studentID chemistry math english
----------------------------------------
1 86 NA NA
2 85 72 NA
3 NA 90 52
以下是創建我的采樣器db的代碼:
course.db <- data.table(
studentID=c("1", "2", "2", "3", "3"),
course=c("chemistry", "chemistry", "math", "english", "math"),
grade=c(86, 85, 72, 52, 90)
)
我通常做的是創建一個帶有常用信息(GPA,學校等)的學生文件數據庫,如下所示:
student.files <- course.db[, .(
average=mean(grade, na.rm=T) #more vars are created here
), by="studentID"]
然后我用我需要的等級創建另一張桌子:
math.grades <- course.db[course=="math", .(
math=grade
), by="studentID"]
然后我合並了整個事情。 只有少數幾門課程才能獲得成績。 但是我需要從至少十幾門課程中編寫成績。 所以我的問題是: 如何根據“等級”欄的價值有條件地確定等級? 我在找什么:
#careful: not working code
student.files <- course.db[, .(
average = mean(grade, na.rm=T) #more vars are created here,
math = ThenAMiracleOccurs("math", grade),
english = ThenAMiracleOccurs("english", grade),
chemistry = ThenAMiracleOccurs("chemistry", grade),
), by="studentID"]
謝謝你,休伯特。 我沒有注意到有一個data.table版本(我的數據庫非常大,所以我需要盡可能保留在data.table世界中)。 這是一個使用dcast for data.table的工作解決方案:
dcast.data.table(course.db, studentID~course, value.var="grade" )
注釋:一個簡單的dcast也可以工作並使用data.table方法,只要該表已經是一個data.table對象:
dcast(course.db, studentID~course, value.var="grade" )
結果:
studentID chemistry english math
1: 1 86 NA NA
2: 2 85 NA 72
3: 3 NA 52 90
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.