7

Assuming I have a melted data.frame that looks like this:

  variable       value
1         A -0.19933093
2         A -1.19043346
3         A -1.32248172
4         A -1.98644507
5         A -0.07930953
6         B -0.10074686
7         B  0.72451483
8         B -0.40914044
9         B  0.02913376
10        B  0.16062491

How do I get it to:

  A       B
-0.19933093 -0.10074686
-1.19043346  0.72451483
-1.32248172 -0.40914044
-1.98644507  0.02913376
-0.07930953  0.16062491

Seems trivial but I am blanking on an answer. dcast and acast do not seem to do it. My goal is to do this on larger datasets and turn the end product into a matrix with the column names to be the variable names. I tried playing with daply and laply (before melting) without much luck.

Maiasaura
  • 32,226
  • 27
  • 104
  • 108

3 Answers3

9

Try unstack:

dat <- read.table(text = "variable       value
1         A -0.19933093
2         A -1.19043346
3         A -1.32248172
4         A -1.98644507
5         A -0.07930953
6         B -0.10074686
7         B  0.72451483
8         B -0.40914044
9         B  0.02913376
10        B  0.16062491",sep = "",header = TRUE)

> unstack(dat,value~variable)

            A           B
1 -0.19933093 -0.10074686
2 -1.19043346  0.72451483
3 -1.32248172 -0.40914044
4 -1.98644507  0.02913376
5 -0.07930953  0.16062491

But I should add that I would love to know how to do this using dcast, as I've also tried repeatedly and haven't been able to.

joran
  • 169,992
  • 32
  • 429
  • 468
  • I don't think it's possible with `dcast` without adding another column as the `variable` column alone doesn't uniquely identify each data point. Put more loosely, it doesn't know which row to put the values into. – Aaron left Stack Overflow Apr 26 '12 at 01:54
4

Alright, begin with a data frame in wide form, containing an id. melt() it to give the long form, then dcast() it to get back to the original data frame.

library(reshape2)
df = read.table(text = "id   A   B
1  1 -0.19933093 -0.10074686
2  2 -1.19043346  0.72451483
3  3 -1.32248172 -0.40914044
4  4 -1.98644507  0.02913376
5  5 -0.07930953  0.16062491", sep = "", header = TRUE)

df

df.melt = melt(df, "id")
df.melt

df.original = dcast(df.melt, id~variable)

df.original
Sandy Muspratt
  • 31,719
  • 12
  • 116
  • 122
2

Using acast() to return a matrix. It needs an id variable.

library(reshape2)
dat <- read.table(text = "variable       value
1         A -0.19933093
2         A -1.19043346
3         A -1.32248172
4         A -1.98644507
5         A -0.07930953
6         B -0.10074686
7         B  0.72451483
8         B -0.40914044
9         B  0.02913376
10        B  0.16062491",sep = "",header = TRUE)

dat$id = rep(1:5, 2)
dat

acast(dat, id~variable)
Sandy Muspratt
  • 31,719
  • 12
  • 116
  • 122