首页 > 解决方案 > 从长到宽的 R 挑战

问题描述

data1=data.frame("StudentID"=c(1,1,1,2,2,2,2,3,3,3,3),
        "Class"=c(1,1,1,1,1,1,1,2,2,2,2),
        "Grade"=c(1,2,3,1,2,3,4,1,2,3,4),
        "Time"=c(11,12,13,15,17,17,18,6,7,8,9),
        "Fail"=c(1,1,1,0,0,0,0,0,0,0,0),
        "Score"=c(6,6,5,6,9,10,7,9,7,9,6))



data2=data.frame("StudentID"=c(1,2,3),
        "Class"=c(1,1,2),
        "Fail"=c(1,0,0),
        "Time1"=c(11,15,6),
        "Score1"=c(6,6,9),
        "Time2"=c(12,17,7),
        "Score2"=c(6,9,7),
        "Time3"=c(13,17,8),
        "Score3"=c(5,10,9),
        "Time4"=c(-99,18,9),
        "Score4"=c(-99,7,6))

我有'data1'并希望通过重塑'data1'来获得'data2',如图所示。

标签: rdata.table

解决方案


在这里,您可以使用dcastfromdata.table包(特别感谢@RonakShah 指出使用fill = -99as 参数来填充缺失值):

dcast(setDT(data1), StudentID+Class+Fail ~ Grade, value.var = c("Time","Score"), fill = -99)

   StudentID Class Fail Time_1 Time_2 Time_3 Time_4 Score_1 Score_2 Score_3 Score_4
1:         1     1    1     11     12     13    -99       6       6       5     -99
2:         2     1    0     15     17     17     18       6       9      10       7
3:         3     2    0      6      7      8      9       9       7       9       6


推荐阅读