MathGroup Archive 2007

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

Search the Archive

Re: averaging sublists of different lengths

  • To: mathgroup at smc.vnet.net
  • Subject: [mg75494] Re: averaging sublists of different lengths
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Thu, 3 May 2007 03:42:57 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <f19fql$4q7$1@smc.vnet.net>

dantimatter wrote:
> Hello all,
> 
> I have a list of lists like this:
> 
> {{70, 66, 64, 68, 64, 56, 68, 78, 62, 68, 84}, {70, 64, 64, 56, 66,
> 56, 62,
>     64, 66, 88, 54, 72}, {58, 54, 54, 60, 72, 70, 62, 68, 74, 76, 70},
> {66,
>     56, 60, 64, 56, 62, 68, 58, 58, 58, 68, 76, 62, 76, 66, 64, 88,
> 56}, {56,
>     64, 72, 72, 70, 62, 76, 76, 76, 76, 86, 80, 100}, {60, 60, 70, 68,
> 60, 60,
>      50, 56, 60, 70, 62, 68, 88, 84, 82}, {54, 66, 72, 62, 70, 66,
> 70,
>     56}, {60, 60, 60, 62, 74, 80, 70}, {54, 62, 64, 72, 76, 74}, {66,
> 74, 70,
>     80, 54, 54, 64}, {72, 66, 60, 52, 52, 66, 66, 58, 60, 66}}
> 
> What I'd really like is the average all the 1st values, 2nd values,
> etc, but I'm having trouble figuring out how to deal with the fact
> that the lists are not all the same length.   Is there a way to drop
> the sublists as they run out of points to add to the average, i.e. if
> I want the average of all the nth values, but Length[shortSublist] <
> n, can I somehow drop shortSublist and then calculate the average from
> the other sublists?
> 
> Also, the Mean[] function requires more than one data point, but I'd
> still like to extract out the values for which there is only one data
> point.  Is there a way to do this?
> 
> Thanks!
> dan

Dan,

the following solution to your question defines two functions myMean and 
myPart that redefine Mean and Part, respectively. Multiple (conditional) 
definitions are used to handle properly the mean of a list of only one 
numerical quantity (atom or list).

In[1]:=

myPart[expr_, i_Integer] := expr[[i]] /; Length[expr] >= i
myPart[expr_, i_Integer] := Sequence[] /; Length[expr] < i
myPart[expr_, All, i_Integer] := (myPart[#1, i] & ) /@ expr;
myMean[data_List /; Length[data] > 1] := Mean[data];
myMean[(data_)?NumericQ | {(data_)?NumericQ}] := data;

lst = {{70, 66, 64, 68, 64, 56, 68, 78, 62, 68, 84},
     {70, 64, 64, 56, 66, 56, 62, 64, 66, 88, 54, 72},
     {58, 54, 54, 60, 72, 70, 62, 68, 74, 76, 70},
     {66, 56, 60, 64, 56, 62, 68, 58, 58, 58, 68, 76,
      62, 76, 66, 64, 88, 56}, {56, 64, 72, 72, 70,
      62, 76, 76, 76, 76, 86, 80, 100},
     {60, 60, 70, 68, 60, 60, 50, 56, 60, 70, 62, 68,
      88, 84, 82}, {54, 66, 72, 62, 70, 66, 70, 56},
     {60, 60, 60, 62, 74, 80, 70}, {54, 62, 64, 72,
      76, 74}, {66, 74, 70, 80, 54, 54, 64},
     {72, 66, 60, 52, 52, 66, 66, 58, 60, 66}};

myMean /@ {1., Pi, {2*Pi, 4*Pi}}
N[Mean /@ lst]
N[myMean /@ lst]
(myPart[#1, 12] & ) /@ lst
Mean[myPart[lst, All, 2]]
Mean[lst[[All,2]]]

Out[7]=
{1., Pi, 3 Pi}

Out[8]=
{68., 65.1667, 65.2727, 64.5556, 74.3077, 66.5333,
  64.5, 66.5714, 67., 66., 61.8}

Out[9]=
{68., 65.1667, 65.2727, 64.5556, 74.3077, 66.5333,
  64.5, 66.5714, 67., 66., 61.8}

Out[10]=
{72, 76, 80, 68}

Out[11]=
692
---
11

Out[12]=
692
---
11

Regards,
Jean-Marc



  • Prev by Date: Re: Frustrated with Plotting
  • Next by Date: A program check
  • Previous by thread: Re: averaging sublists of different lengths
  • Next by thread: Re: averaging sublists of different lengths