Re: grouping and averaging {x,y} pairs of data

• To: mathgroup at smc.vnet.net
• Subject: [mg37238] Re: grouping and averaging {x,y} pairs of data
• From: daiyanh at earthlink.net (Daitaro Hagihara)
• Date: Fri, 18 Oct 2002 05:16:55 -0400 (EDT)
• References: <aokc56\$ah2\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```In article <aokc56\$ah2\$1 at smc.vnet.net>, "David E. Burmaster"
<deb at alceon.com> wrote:

>Dear Fellows in MathGroup,
>
>I have a list of 17,000+ {x,y} pairs of data
>
>        each x value is a positive integer from 1 to 100+
>
>        each y value is a positive real number
>
>As a *short* example, let's consider:
>
> data = {{3,1},{4,3},{3,2},{1,10},{4,2},{1,6},{5,2},{2,5},{7,1}}
>
>I want to group the data by the x value and report the arithmetic average
>of the y values in each group.
>
>For the example, i want to report:
>
> output = {{1,8},{2,5},{3,1.5},{4,2.5},{5,2},{6,0},{7,1}}
>
>In this example, x=6 does not occur so i report the average y[6] = 0.
>
>Can anyone suggest a way to do this efficiently?/

Block[{data = {{3,1},{4,3},{3,2},{1,10},{4,2},{1,6},
{5,2},{2,5},{7,1}},
sd = Table[{0,0.},{10}]},
Off[Infinity::indet];
Off[General::dbyz];
(sd[[#[[1]],2]]++;sd[[#[[1]],1]]+=#[[2]])&/@data;
sd=MapIndexed[{#2[[1]],Divide@@#}&,sd];
On[Infinity::indet];
On[General::dbyz];
sd/.Indeterminate->0.]

-->
{{1, 8.}, {2, 5.}, {3, 1.5}, {4, 2.5}, {5, 2.}, {6, 0.},
{7, 1.}, {8, 0.}, {9, 0.}, {10, 0.}}

This makes 3 linear passes overall on the data.  For
large data sets, that may be a problem.

DH

```

• Prev by Date: Get rid of unwanted {}
• Next by Date: Re: List processing
• Previous by thread: RE: grouping and averaging {x,y} pairs of data
• Next by thread: Re: grouping and averaging {x,y} pairs of data