Skip to content

Sorting Panel Data by Time

4 messages · economicurtis, David Winsemius, Dennis Murphy

#
I have panel data in the following form:

TIME   X1     S1
 1       1      0.99
 1       2      0.50 
 1       3      0.01
 2       3      0.99
 2       1      0.99
 2       2      0.25
 3       3      0.75
 3       2      0.50
 3       1      0.25
...      ...     ......

And desire a new vector of observations in which one column (S1 above) is
sorted for each second from least to largest. 

That is, a new vector (L1 below) of the form:

TIME   X1     S1       L1
 1       1      0.99    0.01
 1       2      0.50    0.50 
 1       3      0.01    0.99
 2       3      0.99    0.25
 2       1      0.99    0.99
 2       2      0.25    0.99
 3       3      0.75    0.25
 3       2      0.50    0.50
 3       1      0.25    0.75
...      ...     ......    .....

Sorry for the NOOB question, but any help would be great. 

Curtis Kephart

--
View this message in context: http://r.789695.n4.nabble.com/Sorting-Panel-Data-by-Time-tp4017271p4017271.html
Sent from the R help mailing list archive at Nabble.com.
#
On Nov 8, 2011, at 2:58 PM, economicurtis wrote:

            
> dat$L1 <- unlist (with( dat, tapply(S1, TIME, sort)) )
 > dat
   TIME X1   S1   L1
1    1  1 0.99 0.01
2    1  2 0.50 0.50
3    1  3 0.01 0.99
4    2  3 0.99 0.25
5    2  1 0.99 0.99
6    2  2 0.25 0.99
7    3  3 0.75 0.25
8    3  2 0.50 0.50
9    3  1 0.25 0.75
David Winsemius, MD
West Hartford, CT
#
Here's another approach using the plyr and data.table packages, where
df is the name I gave to your example data:

# plyr
library('plyr')
ddply(df, .(TIME), mutate, L1 = sort(S1))

# Another way with the data.table package:
library('data.table')
dt <- data.table(df, key = 'TIME')
dt[, list(X1, S1, L1 = sort(S1)), by = 'TIME']

HTH,
Dennis
On Tue, Nov 8, 2011 at 11:58 AM, economicurtis <curtisesjunk at gmail.com> wrote: