MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Sorting by date

  • To: mathgroup at smc.vnet.net
  • Subject: [mg72670] Re: Sorting by date
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Sun, 14 Jan 2007 05:06:53 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <eoa6ji$mi6$1@smc.vnet.net>

Clifford Martin wrote:
> Hi All,
> 
> I have a list of lists that looks like so:
> 
> 
> {{3, 137.5, 13978, {2005, 2, 8}}, {3, 138.5, 12519, {2005, 1, 4}}, {3, 171.9, 15835, {2005, 4, 12}}, {3, 142.8, 17137, {2005, 11, 19}}, 
>   {3, 161.1, 18881, {2006, 1, 18}}, {3, 108.7, 20055, {2006, 2, 28}}, {3, 157, 21498, {2006, 9, 14}}, {3, 118.1, 10891, {2004, 11, 12}}}
> 
> The last element per vector is a date. I'd like to sort the list so that the vectors are arranged in ascending order of date, i.e. the vector containing {2004,11,12}  should be first and and the vector containing {2006,9,14}  should be last. Any help would be appreciated.
> 
> Thanks
> 
> Cliff

Hi Cliff,

The most efficient way to order your list should be by using the 
function *Ordering* [1]: "Ordering[list] gives the positions in list at 
which each successive element of Sort[list] appears." For instance,

In[1]:=
data ={{3, 137.5, 13978, {2005, 2, 8}}, {3, 138.5, 12519, {2005, 1, 4}},
     {3, 171.9, 15835, {2005, 4, 12}}, {3, 142.8, 17137, {2005, 11, 19}},
     {3, 161.1, 18881, {2006, 1, 18}}, {3, 108.7, 20055, {2006, 2, 28}},
     {3, 157, 21498, {2006, 9, 14}}, {3, 118.1, 10891, {2004, 11, 12}}};

In[2]:=
data[[Ordering[data[[All,4]]]]]

Out[2]=
{{3, 118.1, 10891, {2004, 11, 12}}, {3, 138.5, 12519, {2005, 1, 4}},
   {3, 137.5, 13978, {2005, 2, 8}}, {3, 171.9, 15835, {2005, 4, 12}},
   {3, 142.8, 17137, {2005, 11, 19}}, {3, 161.1, 18881, {2006, 1, 18}},
   {3, 108.7, 20055, {2006, 2, 28}}, {3, 157, 21498, {2006, 9, 14}}}

How does this work? We want to sort the main list (data in our example) 
according to the sublists that compose the fourth column of data.

In[3]:=
data[[All,4]]

Out[3]=
{{2005, 2, 8}, {2005, 1, 4}, {2005, 4, 12}, {2005, 11, 19}, {2006, 1, 
18}, {2006, 2, 28},
   {2006, 9, 14}, {2004, 11, 12}}

So, we want our list sorted in ascending order, as in

In[4]:=
Sort[data[[All,4]]]

Out[4]=
{{2004, 11, 12}, {2005, 1, 4}, {2005, 2, 8}, {2005, 4, 12}, {2005, 11, 
19}, {2006, 1, 18},
   {2006, 2, 28}, {2006, 9, 14}}

The function *Ordering* gives us a list of the position of the element 
as if they were sorted by the command sort above.

In[5]:=
Ordering[data[[All,4]]]

Out[5]=
{8, 2, 1, 3, 4, 5, 6, 7}

Now, we just have to use this result and the function Part with our 
original list. Voila!

Regards,
Jean-Marc

[1] http://documents.wolfram.com/mathematica/functions/Ordering


  • Prev by Date: Re: Sorting by date (CORRECTION)
  • Next by Date: Re: Call-by-reference from inside a function
  • Previous by thread: Re: Sorting by date
  • Next by thread: Re: Sorting by date