2016-10-05 73 views
1

我有一个分数较高的课程,分数和学生ID。它看起来是这样的(多了很多变数,除去简化):使用data.table制表学校成绩(长表格到宽表格)

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 

下面是创建我的采样分贝代码:

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"] 

然后我创建另一个表与I级需要:

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

看看''的data.table'不需要调用'dcast.data.table',只要'course.db'已经dcast' – HubertL

回答

3

谢谢休伯特。我没有注意到有一个data.table版本(我的db非常大,所以我需要尽可能留在data.table世界)。下面是使用dcast为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 
+1

最新版本?一个'data.table',你可以使用'dcast'。 – MichaelChirico