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 > > > > > > >