2016-10-05 2 views
1

Ich habe eine große db von Kursen mit der Note und Studenten ID. Es sieht aus wie das ist etwas (mit viel mehr Variablen, die zur Vereinfachung entfernt wurden):Tabellierung von Schulnoten mit data.table (lange Form zu breiter Form)

studentID course  grade 
-------------------------------- 
1   chemistry 86 
2   chemistry 85 
2   math   72 
3   english  52 
3   math   90 
... 

ich diese große Datei in eine Datei umwandeln müssen, wo jeder Schüler ihre Reihe mit den Noten für die verschiedenen Kurse hat. Etwas mehr wie folgt aus:

studentID chemistry math english 
---------------------------------------- 
1   86   NA  NA 
2   85   72  NA 
3   NA   90  52 

Hier ist der Code meine Sampler db zu erstellen:

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) 
      ) 

Was ich in der Regel tun, ist ich eine Studentenakte db mit den üblichen Informationen erstellen (GPA, Schule, usw.) wie folgt aus:

student.files <- course.db[, .(
    average=mean(grade, na.rm=T) #more vars are created here 
), by="studentID"] 

Dann eine andere Tabelle mit der Note ich schaffe ich brauche:

math.grades <- course.db[course=="math", .(
    math=grade 
), by="studentID"] 

Dann fusioniere ich das Ganze. Das funktioniert, wenn es nur wenige Kurse gibt. Aber ich muss Noten von mindestens einem Dutzend Kurse zusammenstellen. Also meine Frage ist: Wie kann ich die Note abhängig vom Wert der "Grad" -Spalte bedingt? Wonach ich suche:

#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"] 
+2

Blick auf 'dcast' – HubertL

Antwort

3

Danke Hubert. Ich hatte nicht bemerkt, dass es eine data.table-Version gab (meine db ist ziemlich groß, so dass ich, wenn immer möglich, in der data.table-Welt bleiben muss). Hier ist eine Arbeitslösung dcast für data.table mit:

dcast.data.table(course.db, studentID~course, value.var="grade") 

von Kommentar Bekannt: ein einfaches dcast wird auch funktionieren und die data.table Methode verwenden, solange die Tabelle ist bereits ein data.table Objekt:

dcast(course.db, studentID~course, value.var="grade") 

Ergebnis:

studentID chemistry english math 
1:   1  86  NA NA 
2:   2  85  NA 72 
3:   3  NA  52 90 
+1

Neuere Versionen von' data.table' erfordern nicht Aufruf 'dcast.data.table', solange' course.db' schon ist? eine 'data.table', können Sie einfach' dcast' verwenden. – MichaelChirico