Re: Summing list subsets

• To: mathgroup at smc.vnet.net
• Subject: [mg30768] Re: Summing list subsets
• From: "Allan Hayes" <hay at haystack.demon.co.uk>
• Date: Sun, 9 Sep 2001 20:43:01 -0400 (EDT)
• References: <9ncfgn\$prb\$1@smc.vnet.net> <9nf62q\$sdi\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Mark,
Here is a variant of my previous function; it keeps the order of the y
values for each element in Union[x].

Aggregate2[x_,y_, F_]:=
{First[#1],F@@y[[#2]]}&@@@Transpose/@Split[Sort[
Transpose[{x,Range[Length[x]]}]], #[[1]]==#2[[1]]&]

x = {a,b,b,b,b,c,d,d,d,d,d,e,f,a};
y = {1,2,0,3,-1,-3,4,5,-4,-2,6,-6,0,-5};

Aggregate2[x,y,F]

{{a,F[1,-5]},{b,F[2,0,3,-1]},{c,F[-3]},{d,F[4,5,-4,-2,6]},{e,F[-6]},{f,F[0]}
}

--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"Allan Hayes" <hay at haystack.demon.co.uk> wrote in message
news:9nf62q\$sdi\$1 at smc.vnet.net...
> Mark,
> Two suggestions:
>
> This is the most versatile, allowing for arbitrary ordering and zeros and
> cancelation in y.
>
> x = {a,b,b,b,b,c,d,d,d,d,d,e,f,a};
> y = {1,2,2,2,2,3,4,4,4,4,4,1,0,-1};
>
> Aggregate[x_,y_, F_]:=
> Apply[
>  {First[#1],F@@#2}&
>  ,
>  Transpose/@
>   Split[
>    Sort[Transpose[{x,y}]],
>    First[#1]== First[#2]&
>   ]
>  ,
>  {1}
> ]
>
> Aggregate[x,y,F]
>
> {{a,F[-1,1]},{b,F[2,2,2,2]},{c,F[3]},{d,F[4,4,4,4,4]},{e,F[1]},{f,F[0]}}
>
>
> This is quicker for your particular example, but does not allow for zeros
> and cancellation in the
>
> Replace[
>  Tr[x y]/.z_Plus:>List@@z,
>  x_. y_Symbol:> {x,y},
>  {1}
> ]
>
> {{8,b},{3,c},{20,d},{1,e}}
>
> --
> Allan
> ---------------------
> Allan Hayes
> Mathematica Training and Consulting
> Leicester UK
> www.haystack.demon.co.uk
> hay at haystack.demon.co.uk
> Voice: +44 (0)116 271 4198
> Fax: +44 (0)870 164 0565
>
> "Mark Coleman" <mcoleman at bondspace.com> wrote in message
> news:9ncfgn\$prb\$1 at smc.vnet.net...
> > Greetings:
> >
> > Consider two lists:
> >
> > x = {a,a,b,b,b,b,c,d,d,d,d,d,} and  y = {1,1,2,2,2,2,3,4,4,4,4,4}
> >
> > I would like to have a function that returns the sum (or any other
> function)
> > of each unique element of x, given the corresponding value in y. That
is,
> > for a 'Sum', the result would be
> >
> > z={{a,2},{b,8},{c,3},{d,20}}
> >
> > This is similar in spirit to a common database aggregation problem.
> >
> > Any ideas?
> >
> > Thanks.
> >
> > -Mark
> >
> >
>
>
>

```

• Prev by Date: Re: Math 1 Fonts Problem, Another Aspect
• Next by Date: decision analysis
• Previous by thread: Re: Summing list subsets
• Next by thread: Re: Summing list subsets