[R] placing multiple rows in a single row
David Winsemius
dwinsemius at comcast.net
Mon Jul 4 21:00:47 CEST 2011
On Jul 4, 2011, at 2:32 PM, Annemarie Verkerk wrote:
> Dear people from the R help list,
>
> I have a question that I can't get my head around to start
> answering, that is why I am writing to the list.
>
> I have data in a format like this (tabs might look weird):
>
> John A1 1 0 1
> John A2 1 1 1
> John A3 1 0 0
> Mary A1 1 0 1
> Mary A2 0 0 1
> Mary A3 1 1 0
> Peter A1 1 0 0
> Peter A2 0 0 1
> Peter A3 1 1 1
> Josh A1 1 0 0
> Josh A2
> Josh A3 0 0 0
>
> I want to convert it into a format where variable rows from a single
> subject are placed behind each other, but with the different scores
> still matching up (i.e., it needs to be able to cope with missing
> data, as for Josh's A2 score).
>
> John A1 1 0 1 A2 1 1 1 A3 1
> 0 0
> Mary A1 1 0 1 A2 0 0 1 A3 1
> 1 0
> Peter A1 1 0 0 A2 0 0 1 A3 1
> 1 1
> Josh A1 1 0 0 A2 A3 0 0 0
>
> Preferably, the row identification would become the header of the
> new table, something like this:
>
> A11 A12 A13 A21 A22 A23 A31 A32 A33
> John 1 0 1 1 1 1 1 0 0
> Mary 1 0 1 0 0 1 1 1 0
> Peter 1 0 0 0 0 1 1 1 1
> Josh 1 0 0 0 0 0
>
> Probably, this has been addressed before - I just don't know how to
> search for the answer with the right search terms.
>
> Any help is appreciated, even just a link to a page where this is
> addressed!
There is a reshape function in the stats package that nobody except
Phil Spector seems to understand and then there is the reshape and
reshape2 packages that everybody seems to get. (I don't understand why
the classification variables are on the left-hand-side, though.
Positionally it makes some sense, but logically it does not connect
with how I understand the process.)
require(reshape2)
# entered your data with default names V1 V2 V3 V4 V5
> nam123
V1 V2 V3 V4 V5
1 John A1 1 0 1
2 John A2 1 1 1
3 John A3 1 0 0
4 Mary A1 1 0 1
5 Mary A2 0 0 1
6 Mary A3 1 1 0
7 Peter A1 1 0 0
8 Peter A2 0 0 1
9 Peter A3 1 1 1
10 Josh A1 1 0 0
11 Josh A2 NA NA NA
12 Josh A3 0 0 0
> nams.mlt <- melt(nam123, idvars=c("V1", "V2"))
> str(nams.mlt)
'data.frame': 36 obs. of 4 variables:
$ V1 : Factor w/ 4 levels "John","Josh",..: 1 1 1 3 3 3 4 4 4
2 ...
$ V2 : Factor w/ 3 levels "A1","A2","A3": 1 2 3 1 2 3 1 2 3 1 ...
$ variable: Factor w/ 3 levels "V3","V4","V5": 1 1 1 1 1 1 1 1 1 1 ...
$ value : int 1 1 1 1 0 1 1 0 1 1 ...
> dcast(nams.mlt, V1+V2 ~ variable)
V1 V2 V3 V4 V5
1 John A1 1 0 1
2 John A2 1 1 1
3 John A3 1 0 0
4 Josh A1 1 0 0
5 Josh A2 NA NA NA
6 Josh A3 0 0 0
7 Mary A1 1 0 1
8 Mary A2 0 0 1
9 Mary A3 1 1 0
10 Peter A1 1 0 0
11 Peter A2 0 0 1
12 Peter A3 1 1 1
> dcast(nams.mlt, V1 ~ V2+variable)
V1 A1_V3 A1_V4 A1_V5 A2_V3 A2_V4 A2_V5 A3_V3 A3_V4 A3_V5
1 John 1 0 1 1 1 1 1 0 0
2 Josh 1 0 0 NA NA NA 0 0 0
3 Mary 1 0 1 0 0 1 1 1 0
4 Peter 1 0 0 0 0 1 1 1 1
You can always change the names of the dataframe if you want, and in
this case it would be a simple sub() operation. Personally I would
substitute "." rather than "".
--
David Winsemius, MD
West Hartford, CT
More information about the R-help
mailing list