Thanks Bill and the other guys for the variety of useful replies!
In fact I'm working with pretty big lists (with ~35000 sublists) and Bill's 
solution is the fastest one in terms of computing time.
Now comes the second part of the question... :-)
I've my usual list of values and time indices to sort:
A1<-list(c(1:4),c(2,4,5),23,c(4,5,13))
and then another list A2 with variables which have to be paired with the values 
of A1:
A2<-sapply(A1, "exp")    #(in my case there's no exp relation between A1 and 
A2, they're completely uncorrelated. That's just an example ) 
> A2
[[1]]
[1]  2.718282  7.389056 20.085537 54.598150

[[2]]
[1]   7.389056  54.598150 148.413159

[[3]]
[1] 9744803446

[[4]]
[1]     54.59815    148.41316 442413.39201

Now I'd like to reorder the elements of A2 according to the same rule applied 
for A1:
 f <- function (x) {
lengths <- vapply(x, FUN = length, FUN.VALUE = 0L)
split(rep(seq_along(x), lengths), unlist(x, use.names = FALSE))
}
B1<-f(A1)

and thus obtain a list B2 which looks like this:
> B2
$`1`
[1] 2.718282

$`2`
[1] 7.389056 7.389056

$`3`
[1] 20.08554

$`4`
[1] 54.59815 54.59815 54.59815

$`5`
[1] 148.4132 148.4132

$`13`
[1] 442413.4

$`23`
[1] 9744803446

(In this example each element is the exp() of the sublist name, but in a 
general case they would be uncorrelated, and the resulting elements of each 
sublist would be different)
Any idea?
Alfio
 

> From: wdun...@tibco.com
> Date: Tue, 8 Jul 2014 12:11:09 -0700
> Subject: Re: [R] reorder a list
> To: alfio...@hotmail.com
> CC: r-help@r-project.org
> 
> f <- function (x) {
>     lengths <- vapply(x, FUN = length, FUN.VALUE = 0L)
>     split(rep(seq_along(x), lengths), unlist(x, use.names = FALSE))
> }
> f(A1) # gives about what you want (has, e.g., name 23, not position
> 23, in output)
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
> 
> 
> On Tue, Jul 8, 2014 at 9:39 AM, Lorenzo Alfieri <alfio...@hotmail.com> wrote:
> > Hi,
> > I'm trying to find a way to reorder the elements of a list.
> > Let's say I have a list like this:
> > A1<-list(c(1:4),c(2,4,5),23,c(4,5,13))
> >
> >> A1
> > [[1]]
> > [1] 1 2 3 4
> >
> > [[2]]
> > [1] 2 4 5
> >
> > [[3]]
> > [1] 23
> >
> > [[4]]
> > [1]  4  5 13
> >
> > All the elements included in it are values, while each sublist is a time 
> > index
> > Now, I'd like to reorder the list (without looping) so to obtain one 
> > sublist for each value, which include all the time indices where each value 
> > appears.
> > In other words, the result should look like this:
> >>A2
> > [[1]]
> > [1] 1
> >
> > [[2]]
> > [1] 1 2    #because value "2" appears in the time index [[1]] and [[2]] of 
> > A1
> >
> > [[3]]
> > [1] 1
> >
> > [[4]]
> > [1] 1 2 4
> >
> > [[5]]
> > [1] 2 4
> >
> > [[13]]
> > [1] 4
> >
> > [[23]]
> > [1] 3
> >
> > Any suggestion?
> > Thanks
> > Alfio
> >
> >
> >         [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help@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.
                                          
        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to