我有一些大学生数据,包括学生ID号,课程代码,学生上课时的学期号以及他们在该课程中获得的最终成绩。我希望每个学生每学期结束后有1行。这意味着,如果StudentX在第1学期修了4门课程,而在第2学期修了4门不同的课程,那么StudentX的第1行将是一个包含在第1学期修读的4门课程的成绩的向量。 ,第一学期修了4门课程,第二学期修了4门课程,等等。
我尝试使用tidyr
spread()
来简单地从长格式转换为宽格式。但是,这导致第1行仅包含第1学期课程,第2行仅包含第2学期课程,依此类推。
以下是我使用的数据示例:
| id | semester_number | course_code | final_grade |
| 1 | 1 | MATH1010 | 2.3 |
| 1 | 1 | PSYC1000 | 4.3 |
| 1 | 2 | MATH1020 | 3.3 |
| 1 | 2 | PSYC2000 | 3.7 |
| 1 | 3 | MATH2080 | 2.0 |
| 1 | 3 | STAT2800 | 2.3 |
| 2 | 1 | PHY1010 | 3.3 |
| 2 | 1 | MATH1010 | 4.3 |
| 2 | 2 | PHY1020 | 0 |
| 2 | 2 | MATH1020 | 2.0 |
spread(distinct(df, id, course_code, semester_number, .keep_all = T),
course_code, final_grade, fill=0)
此代码使用Course_code作为列并将final_grade作为值将数据帧转换为宽格式,并按学期分隔(Row1 = semester1,Row2 = semester2,Row3 = semester3,等等)。
我希望Row1 = semester1,Row2 = semester1和semester2,Row3 = semester1和semester2和semester3,等等。可以将其视为第十个学期后学生学术生涯的快照。
是否可以通过id合并行(Row1 = Row1,Row2 = Row1 + Row2,Row3 = Row1 + Row2 + Row3等),或者在从长到宽转换之前可以做些什么?