Re: [R] reorder a list

2014-07-09 Thread Lorenzo Alfieri
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.59815148.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.


Re: [R] reorder a list

2014-07-09 Thread William Dunlap
Is the following 'g' what you want?  A better example might be with
   A2a - lapply(A1, function(x)x+seq_along(x)/(100*length(x)))

g - function (x, y) {
xLengths - vapply(x, FUN = length, FUN.VALUE = 0L)
yLengths - vapply(y, FUN = length, FUN.VALUE = 0L)
stopifnot(identical(xLengths, yLengths))
split(unlist(y, use.names = FALSE), unlist(x, use.names = FALSE))
}
Used as
 g(A1,A2)
$`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


Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Wed, Jul 9, 2014 at 2:04 AM, Lorenzo Alfieri alfio...@hotmail.com
wrote:

 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.59815148.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.


Re: [R] reorder a list

2014-07-09 Thread Lorenzo Alfieri
Thanks for the suggestion.
I found that I get the result I wanted with this simple command:

split(unlist(A2),unlist(A1))

$`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

which is indeed very similar to Bill's solution

Alfio

From: wdun...@tibco.com
Date: Wed, 9 Jul 2014 09:26:14 -0700
Subject: Re: [R] reorder a list
To: alfio...@hotmail.com
CC: r-help@r-project.org

Is the following 'g' what you want?  A better example might be with   A2a - 
lapply(A1, function(x)x+seq_along(x)/(100*length(x)))
g - function (x, y) {

xLengths - vapply(x, FUN = length, FUN.VALUE = 0L)yLengths - 
vapply(y, FUN = length, FUN.VALUE = 0L)stopifnot(identical(xLengths, 
yLengths))split(unlist(y, use.names = FALSE), unlist(x, use.names = FALSE))

}Used as g(A1,A2)$`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


Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Wed, Jul 9, 2014 at 2:04 AM, Lorenzo Alfieri alfio...@hotmail.com wrote:





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.59815148.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.


[R] reorder a list

2014-07-08 Thread Lorenzo Alfieri
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.


Re: [R] reorder a list

2014-07-08 Thread Greg Snow
Here is one approach that gives almost the same answer as your example:

 A1-list(c(1:4),c(2,4,5),23,c(4,5,13))

 A2 - sort(unique(unlist(A1)))
 names(A2) - A2
 sapply(A2, function(x) which( sapply(A1, function(y) x %in% y) ),
+ simplify=FALSE, USE.NAMES=TRUE )
$`1`
[1] 1

$`2`
[1] 1 2

$`3`
[1] 1

$`4`
[1] 1 2 4

$`5`
[1] 2 4

$`13`
[1] 4

$`23`
[1] 3

If you want the `23` to be in the 23rd element of the list (with empty
values before it) then just change A2 to be a vector from 1 to the
largest value

On Tue, Jul 8, 2014 at 10: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.



-- 
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com

__
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.


Re: [R] reorder a list

2014-07-08 Thread jim holtman
Try this:

 A1-list(c(1:4),c(2,4,5),23,c(4,5,13))

 # unlist with the list number
 result - do.call(rbind, sapply(seq(length(A1)), function(.indx){
+ cbind(value = A1[[.indx]], index = .indx)
+ }))

 ans - split(result[, 2], result[, 1])
 ans
$`1`
[1] 1

$`2`
[1] 1 2

$`3`
[1] 1

$`4`
[1] 1 2 4

$`5`
[1] 2 4

$`13`
[1] 4

$`23`
[1] 3



Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.


On Tue, Jul 8, 2014 at 12:39 PM, 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.


Re: [R] reorder a list

2014-07-08 Thread Greg Snow
And here is another approach:

 out - vector('list',length(unique(unlist(A1
 names(out) - sort(unique(unlist(A1)))
 for( i in seq_along(A1) ) {
+ for( j in as.character(A1[[i]]) ) {
+ out[[j]] - c(out[[j]], i)
+ }
+ }

 out
$`1`
[1] 1

$`2`
[1] 1 2

$`3`
[1] 1

$`4`
[1] 1 2 4

$`5`
[1] 2 4

$`13`
[1] 4

$`23`
[1] 3

Which approach is faster/more efficient could depend on what your real
data looks like, how big the list is, how large/variable the vectors
within the list are.  Both methods could probably also be improved,
but unless the list is big enough that either takes quite a bit of
time then it is probably not worth the time to optimize them.

On Tue, Jul 8, 2014 at 11:11 AM, Greg Snow 538...@gmail.com wrote:
 Here is one approach that gives almost the same answer as your example:

 A1-list(c(1:4),c(2,4,5),23,c(4,5,13))

 A2 - sort(unique(unlist(A1)))
 names(A2) - A2
 sapply(A2, function(x) which( sapply(A1, function(y) x %in% y) ),
 + simplify=FALSE, USE.NAMES=TRUE )
 $`1`
 [1] 1

 $`2`
 [1] 1 2

 $`3`
 [1] 1

 $`4`
 [1] 1 2 4

 $`5`
 [1] 2 4

 $`13`
 [1] 4

 $`23`
 [1] 3

 If you want the `23` to be in the 23rd element of the list (with empty
 values before it) then just change A2 to be a vector from 1 to the
 largest value

 On Tue, Jul 8, 2014 at 10: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.



 --
 Gregory (Greg) L. Snow Ph.D.
 538...@gmail.com



-- 
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com

__
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.


Re: [R] reorder a list

2014-07-08 Thread Greg Snow
Here is another approach inspired by Jim's answer:

 names(A1) - paste0(seq_along(A1),'.')
 tmp - unlist(A1)
 split( rep( seq_along(A1), sapply(A1,length) ), 
 as.numeric(sub('\\..+$','',tmp)) )
$`1`
[1] 1

$`2`
[1] 1 2

$`3`
[1] 1

$`4`
[1] 1 2 4

$`5`
[1] 2 4

$`13`
[1] 4

$`23`
[1] 3

On Tue, Jul 8, 2014 at 11:10 AM, jim holtman jholt...@gmail.com wrote:
 Try this:

 A1-list(c(1:4),c(2,4,5),23,c(4,5,13))

 # unlist with the list number
 result - do.call(rbind, sapply(seq(length(A1)), function(.indx){
 + cbind(value = A1[[.indx]], index = .indx)
 + }))

 ans - split(result[, 2], result[, 1])
 ans
 $`1`
 [1] 1

 $`2`
 [1] 1 2

 $`3`
 [1] 1

 $`4`
 [1] 1 2 4

 $`5`
 [1] 2 4

 $`13`
 [1] 4

 $`23`
 [1] 3



 Jim Holtman
 Data Munger Guru

 What is the problem that you are trying to solve?
 Tell me what you want to do, not how you want to do it.


 On Tue, Jul 8, 2014 at 12:39 PM, 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.



-- 
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com

__
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.


Re: [R] reorder a list

2014-07-08 Thread Greg Snow
Oops, I combined 2 ideas (by chance it still worked), the last line
should have been one of the following:

split( rep( seq_along(A1), sapply(A1,length) ), tmp )

split( as.numeric(sub('\\..*$','',names(tmp))), tmp )

On Tue, Jul 8, 2014 at 11:41 AM, Greg Snow 538...@gmail.com wrote:
 Here is another approach inspired by Jim's answer:

 names(A1) - paste0(seq_along(A1),'.')
 tmp - unlist(A1)
 split( rep( seq_along(A1), sapply(A1,length) ), 
 as.numeric(sub('\\..+$','',tmp)) )
 $`1`
 [1] 1

 $`2`
 [1] 1 2

 $`3`
 [1] 1

 $`4`
 [1] 1 2 4

 $`5`
 [1] 2 4

 $`13`
 [1] 4

 $`23`
 [1] 3

 On Tue, Jul 8, 2014 at 11:10 AM, jim holtman jholt...@gmail.com wrote:
 Try this:

 A1-list(c(1:4),c(2,4,5),23,c(4,5,13))

 # unlist with the list number
 result - do.call(rbind, sapply(seq(length(A1)), function(.indx){
 + cbind(value = A1[[.indx]], index = .indx)
 + }))

 ans - split(result[, 2], result[, 1])
 ans
 $`1`
 [1] 1

 $`2`
 [1] 1 2

 $`3`
 [1] 1

 $`4`
 [1] 1 2 4

 $`5`
 [1] 2 4

 $`13`
 [1] 4

 $`23`
 [1] 3



 Jim Holtman
 Data Munger Guru

 What is the problem that you are trying to solve?
 Tell me what you want to do, not how you want to do it.


 On Tue, Jul 8, 2014 at 12:39 PM, 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.



 --
 Gregory (Greg) L. Snow Ph.D.
 538...@gmail.com



-- 
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com

__
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.


Re: [R] reorder a list

2014-07-08 Thread William Dunlap
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.

__
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.


Re: [R] reorder a list

2014-07-08 Thread arun
You may also try:
library(reshape2)
 A2 - melt(A1)

split(A2[,2],A2[,1])
A.K.




On Tuesday, July 8, 2014 12:57 PM, 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.


__
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.