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: wdunlap@tibco.com
> Date: Tue, 8 Jul 2014 12:11:09 -0700
> Subject: Re: [R] reorder a list
> To: alfios17@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 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]]