Convert data from long format to wide format with multiple measure columns

前端 未结 5 2058
灰色年华
灰色年华 2020-11-22 02:27

I am having trouble figuring out the most elegant and flexible way to switch data from long format to wide format when I have more than one measure variable I want to bring

5条回答
  •  情话喂你
    2020-11-22 03:10

    In order to handle multiple variables like you want, you need to melt the data you have before casting it.

    library("reshape2")
    
    dcast(melt(my.df, id.vars=c("ID", "TIME")), ID~variable+TIME)
    

    which gives

      ID X_1 X_2 X_3 X_4 X_5 Y_1 Y_2 Y_3 Y_4 Y_5
    1  A   1   4   7  10  13  16  19  22  25  28
    2  B   2   5   8  11  14  17  20  23  26  29
    3  C   3   6   9  12  15  18  21  24  27  30
    

    EDIT based on comment:

    The data frame

    num.id = 10 
    num.time=10 
    my.df <- data.frame(ID=rep(LETTERS[1:num.id], num.time), 
                        TIME=rep(1:num.time, each=num.id), 
                        X=1:(num.id*num.time), 
                        Y=(num.id*num.time)+1:(2*length(1:(num.id*num.time))))
    

    gives a different result (all entries are 2) because the ID/TIME combination does not indicate a unique row. In fact, there are two rows with each ID/TIME combinations. reshape2 assumes a single value for each possible combination of the variables and will apply a summary function to create a single variable is there are multiple entries. That is why there is the warning

    Aggregation function missing: defaulting to length
    

    You can get something that works if you add another variable which breaks that redundancy.

    my.df$cycle <- rep(1:2, each=num.id*num.time)
    dcast(melt(my.df, id.vars=c("cycle", "ID", "TIME")), cycle+ID~variable+TIME)
    

    This works because cycle/ID/time now uniquely defines a row in my.df.

提交回复
热议问题