1

Sample Input dataset

   x  y  z
a  1  2 3
b  4  5 6
c  7  8 9

where a,b,c are rownames. x,y,z are column names.

I want output to be like this:

         cell   Value
         a_x      1
         b_x      4
         c_x      7
         a_y      2
         b_y      5
         c_y      8
         a_z      3
         b_z      6
         c_z      9

where cell and value are the 2 columns. How do we do this? I am new to R.

Justin
  • 42,475
  • 9
  • 93
  • 111
Grazy_Cirl
  • 21
  • 2
  • Welcome to SO. Please make a [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) as well as including some of what you have tried so far. If you do those two things, you'll find you get much better answers here. – Justin Nov 19 '13 at 16:59

2 Answers2

2

This should get you close enough: Treat your data.frame as a table and make use of the data.frame method for table to get this long form. Use paste if you really want to combine "Var1" and "Var2".

data.frame(as.table(as.matrix(mydf)))
#   Var1 Var2 Freq
# 1    a    x    1
# 2    b    x    4
# 3    c    x    7
# 4    a    y    2
# 5    b    y    5
# 6    c    y    8
# 7    a    z    3
# 8    b    z    6
# 9    c    z    9

Of course, if your data are already class "table", then just use data.frame(<YourData>).

A5C1D2H2I1M1N2O1R2T1
  • 190,393
  • 28
  • 405
  • 485
1

Sample data:

> d<-data.frame(x=1:3,y=4:6,z=7:9)*10
> d
   x  y  z
1 10 40 70
2 20 50 80
3 30 60 90

You can stack your data frame, but you would still miss the row names:

> s<-stack(d)
  values ind
1     10   x
2     20   x
3     30   x
4     40   y
5     50   y
6     60   y
7     70   z
8     80   z
9     90   z

So append row names to column names:

> s$ind<-paste(s$ind,rownames(d),sep="_")
> s
  values ind
1     10 x_1
2     20 x_2
3     30 x_3
4     40 y_1
5     50 y_2
6     60 y_3
7     70 z_1
8     80 z_2
9     90 z_3
Julián Urbano
  • 8,378
  • 1
  • 30
  • 52