[R] How to 'de-cross' a table?

Thomas Lumley tlumley at u.washington.edu
Fri Jun 3 18:32:31 CEST 2005


On Fri, 3 Jun 2005, Sander Oom wrote:

> Dear R users,
>
> I have received a table in the following format:
>
> id  a   b  c1  c2  d1  d2
> 1   1   1  65  97  78  98
> 2   1   2  65  97  42  97
> 3   2   1  65  68  97  98
> 4   2   2  65  97  97  98
>
> Factors of the design are: a, b, and e, where e has levels c and d. The
> levels c and d then have 2 replicates (r) each.
>
> Now I would like to get:
>
> id  a   b   e   r  value
> 1   1   1   c   1  65
> 2   1   1   c   2  97
> 3   1   1   d   1  78
> 4   1   1   d   2  98
>
> Any suggestions on how to tackle this? I'm not sure what the 'task' is
> called, so struggle to effectively search the web or R help.
>

reshape() is the probably function.  It seems you need to use it twice, 
for the two levels of uncrossing
> d1<-reshape(d, direction="long", 
varying=list(c("c1","d1"),c("c2","d2")), 
v.names=c("rep1","rep2"),timevar="r", times=c("c","d"))
> d1
     id a b r rep1 rep2
1.c  1 1 1 c   65   97
2.c  2 1 2 c   65   97
3.c  3 2 1 c   65   68
4.c  4 2 2 c   65   97
1.d  1 1 1 d   78   98
2.d  2 1 2 d   42   97
3.d  3 2 1 d   97   98
4.d  4 2 2 d   97   98
> reshape(d1, direction="long", varying=list(c("rep1","rep2")), 
v.names="value",idvar="tmp", timevar="r")
     id a b r value tmp
1.1  1 1 1 1    65   1
2.1  2 1 2 1    65   2
3.1  3 2 1 1    65   3
4.1  4 2 2 1    65   4
5.1  1 1 1 1    78   5
6.1  2 1 2 1    42   6
7.1  3 2 1 1    97   7
8.1  4 2 2 1    97   8
1.2  1 1 1 2    97   1
2.2  2 1 2 2    97   2
3.2  3 2 1 2    68   3
4.2  4 2 2 2    97   4
5.2  1 1 1 2    98   5
6.2  2 1 2 2    97   6
7.2  3 2 1 2    98   7
8.2  4 2 2 2    98   8

You can then delete the `tmp` variable if you don't need it.

An easier way to uncross would be with stack()
> stack(d[,4:7])
    values ind
1      65  c1
2      65  c1
3      65  c1
4      65  c1
5      97  c2
6      97  c2
7      68  c2
8      97  c2
9      78  d1
10     42  d1
11     97  d1
12     97  d1
13     98  d2
14     97  d2
15     98  d2
16     98  d2

but you lose the other variables.


 	-thomas




More information about the R-help mailing list