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