[R] Help with package reshape, wide to long

Don MacQueen macq at llnl.gov
Thu Feb 7 19:36:36 CET 2008


It does indeed.

Thank you, Chuck.

-Don

At 1:25 PM -0500 2/7/08, Chuck Cleland wrote:
>On 2/7/2008 11:40 AM, Don MacQueen wrote:
>>Hello,
>>
>>I am having difficulty figuring out how to use functions in the 
>>reshape package to perform a wide to long transformation
>>
>>I have a "wide" dataframe whose columns are like this example:
>>
>>    id1 id2 subject treat height weight age
>>
>>id1 and id2 are unique for each row
>>subject and treat are not unique for each row
>>height, weight, and age are different types of measurements made on 
>>each unique combination of subject and treatment
>>
>>I want to reshape to a long format which will look like this:
>>
>>   id1 id2 subject treat measurement.type value
>>
>>where
>>
>>measurement.type identifies the type of measurement, i.e. 'height', 
>>'weight', 'age'
>>value contains the values of those measurements
>>and the other variables are replicated as necessary
>
>   Does something like this work for you?
>
>df <- data.frame(id1 = c(1,2,3),
>                  id2 = c(4,5,6),
>                  subject = runif(3),
>                  treat = runif(3),
>                  height = runif(3),
>                  weight = runif(3),
>                  age = runif(3))
>
>library(reshape)
>
>melt(df, measure.var = c("height","weight","age"))
>
>   id1 id2   subject      treat variable      value
>1   1   4 0.4736760 0.02221288   height 0.09290354
>2   2   5 0.1708840 0.84465476   height 0.70660286
>3   3   6 0.6955085 0.56084004   height 0.52761841
>4   1   4 0.4736760 0.02221288   weight 0.08853412
>5   2   5 0.1708840 0.84465476   weight 0.85745906
>6   3   6 0.6955085 0.56084004   weight 0.29902097
>7   1   4 0.4736760 0.02221288      age 0.91842595
>8   2   5 0.1708840 0.84465476      age 0.93592277
>9   3   6 0.6955085 0.56084004      age 0.01587108
>
>>To put it another way, can I use reshape() to transform my original 
>>dataframe, which has 45 rows, into a "long" form that has 3*45  = 
>>135 rows:  45 rows for height, 45 for weight, 45 for age, with the 
>>other variables carried along as is within each set of 45, and a 
>>new variable that identifies the type of measurement in each row of 
>>the long form, i.e., 'height' in 45 rows, 'weight' in 45 rows, and 
>>'age' in 45 rows.
>>
>>I know it's not difficult to do this with explicit looping, using 
>>rbind(), but it seems like reshape() is a natural tool. But I'm not 
>>getting it, so I'd appreciate some help.
>>
>>(in case anyone is wondering whether it makes sense to do this, 
>>height, weight, and age are just examples; it makes more sense with 
>>my actual measurements)
>>
>>Thanks
>>-Don
>
>--
>Chuck Cleland, Ph.D.
>NDRI, Inc.
>71 West 23rd Street, 8th floor
>New York, NY 10010
>tel: (212) 845-4495 (Tu, Th)
>tel: (732) 512-0171 (M, W, F)
>fax: (917) 438-0894


-- 
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA
925-423-1062



More information about the R-help mailing list