How to "unmelt" data with reshape r

LP_640 picture LP_640 · Sep 19, 2014 · Viewed 21.7k times · Source

I have a data frame that I melted using the reshape package that I would like to "un melt".

here is a toy example of the melted data (real data frame is 500x100 or larger) :

variable<-c(rep("X1",3),rep("X2",3),rep("X3",3))
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3))
dat <-data.frame(variable,value)
dat
 variable     value
1       X1 0.5285376
2       X1 0.5285376
3       X1 0.5285376
4       X2 0.1694908
5       X2 0.1694908
6       X2 0.1694908
7       X3 0.7446906
8       X3 0.7446906
9       X3 0.7446906

Each variable (X1, X2,X3) has values estimated at 3 different times (which in this toy example happen to be the same, but this is never the case).

I would like to get it (back) in the form of :

     X1        X2        X3
1 0.5285376 0.1694908 0.7446906
2 0.5285376 0.1694908 0.7446906
3 0.5285376 0.1694908 0.7446906

Basically, I would like the variable column to be sorted on ID (X1, X2 etc) and become column headings. I have tried various permutations of cast, dcast, recast, etc.. and cant seem to get the data in the format that I want. It was easy enough to 'melt' data from the wide form to the longer form (e.g. the dat datset), but getting it back is proving difficult. Any ideas? I know this is relatively simple, but I am having a hard time conceptualizing how to do this in reshape or reshape2.

Thanks, LP

Answer

joran picture joran · Sep 19, 2014

I typically do this by creating an id column and then using dcast:

> dat
  variable     value
1       X1 0.4299397
2       X1 0.4299397
3       X1 0.4299397
4       X2 0.2531551
5       X2 0.2531551
6       X2 0.2531551
7       X3 0.3972119
8       X3 0.3972119
9       X3 0.3972119
> dat$id <- rep(1:3,times = 3)
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value")
  id        X1        X2        X3
1  1 0.4299397 0.2531551 0.3972119
2  2 0.4299397 0.2531551 0.3972119
3  3 0.4299397 0.2531551 0.3972119