[R] Wide to long form conversion
Gang Chen
gangchen6 at gmail.com
Fri Oct 7 13:37:02 CEST 2011
Dennis,
Yes, I was wrong! The variables should be:
1) Subj: factor
2) Group: between-subjects factor (2 levels: s / w)
3) Reference: within-subject factor (2 levels: Me / She)
4) F/J: within-subject factor (2 levels: F / J)
5) Time: within-subject factor (2 levels: 1 / 2)
6) Value
So your mData3 is what I was looking for. Thanks a lot!
Gang
On Thu, Oct 6, 2011 at 9:09 PM, Dennis Murphy <djmuser at gmail.com> wrote:
> Hi:
>
>> I have some data 'myData' in wide form (attached at the end), and
>> would like to convert it to long form. I wish to have five variables
>> in the result:
>>
>> 1) Subj: factor
>> 2) Group: between-subjects factor (2 levels: s / w)
>> 3) Reference: within-subject factor (2 levels: Me / She)
>> 4) F: within-subject factor (2 levels: F1 / F2)
>> 5) J: within-subject factor (2 levels: J1 / J2)
>
> I don't see how you can get all of 3-5 given the way your data is
> structured. The problem is that each column contains two of the three
> variables you want, but not all three. I can see a way to get
>
> Subj Group Ref Time F J
> S1 s Me 1 4 5
> S1 s Me 2 3 6
> S1 s She 1 6 10
> S1 s She 2 6 9
>
> or an 8 line version with Ref (4 Me, 4 She), Factor (F1, J1, F2, J2)
> repeated twice and the appropriate response vector, but not a way
> where you have three columns for Ref, F and J. For example, what is
> the 'J' for MeF1 or the F for SheJ2?
>
> With that, here are a few stabs using the reshape2 package. The first
> step is to do a little renaming of your data frame so that one can use
> the colsplit() function to generate a new set of variables.
>
> names(myData) <- c("Group", "Me_F_1", "Me_J_1", "She_F_1", "She_J_1",
> "Me_F_2", "Me_J_2", "She_F_2", "She_J_2", "Subj")
>
> library('plyr')
> library('reshape2')
>
> # collapses the eight columns to be reshaped into a factor named
> # variable with a corresponding variable named value
> mData <- melt(myData, id = c('Subj', 'Group'))
> head(mData)
>
> # Split the original variables into three new columns, named
> # Ref, Var and Time, respectively:
> newvars <- colsplit(mData$variable, '_', c('Ref', 'Var', 'Time'))
>
> # Append these to the melted data frame and remove 'variable'
> mData2 <- cbind(mData, newvars)[, -3]
>
> # This comes closest to your original intent:
> mData3 <- arrange(mData2, Subj, Ref, Var, Time)
> head(mData3, 8)
>
> Subj Group value Ref Var Time
> 1 S1 s 4 Me F 1
> 2 S1 s 3 Me F 2
> 3 S1 s 5 Me J 1
> 4 S1 s 6 Me J 2
> 5 S1 s 6 She F 1
> 6 S1 s 6 She F 2
> 7 S1 s 10 She J 1
> 8 S1 s 9 She J 2
>
> # Some rearrangements to consider:
> mData4 <- cast(mData3, Subj + Group + Ref + Time ~ Var, value_var = 'value')
> head(mData4, 4)
>
> Subj Group Ref Time F J
> 1 S1 s Me 1 4 5
> 2 S1 s Me 2 3 6
> 3 S1 s She 1 6 10
> 4 S1 s She 2 6 9
>
> mData5 <- cast(mData3, Subj + Group + Ref + Var ~ Time, value_var = 'value')
> head(mData5, 4)
>
> Subj Group Ref Var 1 2
> 1 S1 s Me F 4 3
> 2 S1 s Me J 5 6
> 3 S1 s She F 6 6
> 4 S1 s She J 10 9
>
> If you like this one, it's probably a good idea to rename the last two
> columns 'Time1' and 'Time2' or something similar.
>
> HTH,
> Dennis
>
> On Thu, Oct 6, 2011 at 1:28 PM, Gang Chen <gangchen6 at gmail.com> wrote:
>> I have some data 'myData' in wide form (attached at the end), and
>> would like to convert it to long form. I wish to have five variables
>> in the result:
>>
>> 1) Subj: factor
>> 2) Group: between-subjects factor (2 levels: s / w)
>> 3) Reference: within-subject factor (2 levels: Me / She)
>> 4) F: within-subject factor (2 levels: F1 / F2)
>> 5) J: within-subject factor (2 levels: J1 / J2)
>>
>> As this is the first time I'm learning such a conversion, could
>> someone help me out?
>>
>> Many thanks,
>> Gang
>>
>>> myData
>>
>> Group MeF1 MeJ1 SheF1 SheJ1 MeF2 MeJ2 SheF2 SheJ2 Subj
>> 1 s 4 5 6 10 3 6 6 9 S1
>> 2 s 6 5 5 6 4 3 5 6 S2
>> 3 s 7 4 6 5 7 4 5 3 S3
>> 4 s 8 5 8 7 7 1 8 6 S4
>> 5 s 10 6 4 7 9 6 4 6 S5
>> 6 s 5 2 4 7 4 1 4 2 S6
>> 7 s 13 2 10 4 11 2 4 3 S7
>> 8 s 8 1 3 11 6 0 3 10 S8
>> 9 s 6 9 5 8 6 8 5 6 S9
>> 10 s 14 5 6 10 13 5 5 10 S10
>> 11 s 15 2 18 2 14 1 18 2 S11
>> 12 s 6 9 4 9 5 11 3 8 S12
>> 13 s 5 5 0 12 4 3 0 8 S13
>> 14 s 5 6 4 9 4 6 2 6 S14
>> 15 s 14 5 12 3 12 3 11 3 S15
>> 16 s 7 2 11 3 5 2 10 2 S16
>> 17 s 1 7 4 5 1 6 3 5 S17
>> 18 s 6 2 7 4 6 2 7 4 S18
>> 19 s 9 4 8 5 10 4 6 3 S19
>> 20 s 8 2 6 5 9 2 6 4 S20
>> 21 s 6 5 5 7 6 6 5 5 S21
>> 22 s 8 8 3 7 6 7 5 3 S22
>> 23 s 11 4 6 7 1 1 6 4 S23
>> 24 s 6 3 2 4 6 4 2 2 S24
>> 25 s 4 4 6 6 2 3 4 6 S25
>> 26 w 5 9 4 7 3 7 3 5 S26
>> 27 w 7 6 3 5 4 1 0 4 S27
>> 28 w 10 4 14 2 8 4 10 2 S28
>> 29 w 9 7 5 6 8 4 5 3 S29
>> 30 w 9 2 7 5 6 2 6 5 S30
>> 31 w 6 7 6 7 6 5 5 8 S31
>> 32 w 7 6 12 7 6 3 10 7 S32
>> 33 w 12 3 8 9 11 3 4 7 S33
>> 34 w 12 2 10 5 9 2 6 3 S34
>> 35 w 6 3 10 4 5 3 5 3 S35
>> 36 w 9 3 9 9 6 3 7 8 S36
>> 37 w 5 11 7 7 4 11 3 4 S37
>> 38 w 7 4 4 6 7 3 1 5 S38
>> 39 w 6 5 1 8 3 3 0 8 S39
>> 40 w 10 3 10 2 7 3 7 2 S40
>> 41 w 1 11 7 5 1 8 4 3 S41
>> 42 w 10 5 6 10 10 4 3 9 S42
>> 43 w 6 3 9 2 4 2 6 0 S43
>> 44 w 9 5 11 4 5 4 7 3 S44
>> 45 w 8 5 6 3 8 4 2 3 S45
>> 46 w 8 4 8 7 4 1 2 6 S46
>> 47 w 12 2 6 2 10 1 5 2 S47
>> 48 w 10 6 9 8 7 5 7 8 S48
>> 49 w 13 6 15 1 12 4 14 0 S49
>> 50 w 7 8 1 12 4 7 1 11 S50
>> 51 w 12 3 9 4 9 1 7 4 S51
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
More information about the R-help
mailing list