簡體   English   中英

使用data.table(長格式到寬格式)列出學校成績

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM