[R] How to reshape wide format data.frame to long format?

David Winsemius dwinsemius at comcast.net
Thu Jan 20 17:14:08 CET 2011


On Jan 20, 2011, at 10:51 AM, Fredrik Karlsson wrote:

> Dear list,
>
> I need to convert this data.frame
>
>> names(codesM)
> [1] "key"        "AMR.pa1.M"  "AMR.pa2.M"  "AMR.pa3.M"  "AMR.pa4.M"
> [6] "AMR.pa5.M"  "AMR.pa6.M"  "AMR.pa7.M"  "AMR.pa8.M"  "AMR.pa9.M"
> [11] "AMR.pa10.M" "AMR.ta1.M"  "AMR.ta2.M"  "AMR.ta3.M"  "AMR.ta4.M"
> [16] "AMR.ta5.M"  "AMR.ta6.M"  "AMR.ta7.M"  "AMR.ta8.M"  "AMR.ta9.M"
> [21] "AMR.ta10.M" "AMR.ka1.M"  "AMR.ka2.M"  "AMR.ka3.M"  "AMR.ka4.M"
> [26] "AMR.ka5.M"  "AMR.ka6.M"  "AMR.ka7.M"  "AMR.ka8.M"  "AMR.ka9.M"
> [31] "AMR.ka10.M" "SMR.pa1.M"  "SMR.pa2.M"  "SMR.pa3.M"  "SMR.pa4.M"
> [36] "SMR.pa5.M"  "SMR.pa6.M"  "SMR.pa7.M"  "SMR.pa8.M"  "SMR.pa9.M"
> [41] "SMR.pa10.M" "SMR.ta1.M"  "SMR.ta2.M"  "SMR.ta3.M"  "SMR.ta4.M"
> [46] "SMR.ta5.M"  "SMR.ta6.M"  "SMR.ta7.M"  "SMR.ta8.M"  "SMR.ta9.M"
> [51] "SMR.ta10.M" "SMR.ka1.M"  "SMR.ka2.M"  "SMR.ka3.M"  "SMR.ka4.M"
> [56] "SMR.ka5.M"  "SMR.ka6.M"  "SMR.ka7.M"  "SMR.ka8.M"  "SMR.ka9.M"
> [61] "SMR.ka10.M"
>> dim(codesM)
> [1] 42 61
>
> into a 3 x  2501 data.frame where the "key" variable is kept, the
> values in columns 2-61 above is inserted into a "values" column and
> the name of the column is inserted in a third column ("variable"
> perhaps).
>
> Like
>
> key                         variable              value
> POSTOFF_1_1    AMR.pa1.M       5
> POSTOFF_1_1    AMR.pa2.M       3
> ....

I don't "see" anything special about this. If there is an unusual  
aspect to it, then you should post a simpler full example.  What  
happens when you try:

library(reshape2)

longCodes <- melt(codesM)

(Then you can fiddle with the names() of the new dataframe.)

>
> I think I should be able to do this using the "reshape" function, but
> I cannot get it to work. I think I need some help to understand
> this...
>
>
> (If I could split the "variable" into three separate columns splitting
> by ".", that would be even better.)

Use strsplit and "["

If that's not clear, then post results of dput( codesM[1:5, 1:10] ) to  
provide a reproducible example.


>
> I appreciate all the help I could get.
>

-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list