Fred - 1 year ago 59

R Question

This is a basic problem in data analysis which Stata deals with in one step.

Create a wide data frame with time invariant data (x0) and time varying data for years 2000 and 2005 (x1,x2):

`d1 <- data.frame(subject = c("id1", "id2"),`

x0 = c("male", "female"),

x1_2000 = 1:2,

x1_2005 = 5:6,

x2_2000 = 1:2,

x2_2005 = 5:6

)

s.t.

`subject x0 x1_2000 x1_2005 x2_2000 x2_2005`

1 id1 male 1 5 1 5

2 id2 female 2 6 2 6

I want to shape it like a panel so data looks like this:

`subject x0 time x1 x2`

1 id1 male 2000 1 1

2 id2 female 2000 2 2

3 id1 male 2005 5 5

4 id2 female 2005 6 6

I can do this with

`reshape`

`d2 <-reshape(d1,`

idvar="subject",

varying=list(c("x1_2000","x1_2005"),

c("x2_2000","x2_2005")),

v.names=c("x1","x2"),

times = c(2000,2005),

direction = "long",

sep= "_")

My main concern is that when you have dozens of variables the above command gets very long. In

`stata`

`reshape long x1 x2, i(subject) j(year)`

Is there such a simple solution in R?

Answer Source

`reshape`

can guess many of its arguments. In this case it's sufficient to specify the following. No packages are used.

```
reshape(d1, dir = "long", varying = 3:6, sep = "_")
```

giving:

```
subject x0 time x1 x2 id
1.2000 id1 male 2000 1 1 1
2.2000 id2 female 2000 2 2 2
1.2005 id1 male 2005 5 5 1
2.2005 id2 female 2005 6 6 2
```