Re: Summing over like elements

*To*: mathgroup at smc.vnet.net*Subject*: [mg13876] Re: Summing over like elements*From*: buttgereit at netcologne.de (Peter Buttgereit)*Date*: Wed, 2 Sep 1998 01:31:09 -0400*Organization*: Dipl.-Sportl. Peter Buttgereit*References*: <6sdb8i$peq@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

[This followup was posted to comp.soft-sys.math.mathematica and a copy was sent to the cited author.] In article <6sdb8i$peq at smc.vnet.net>, qmak at pipeline.com says... > I have a 2 column array. Column 1 has some values, many of which are > repeated. Column 2 has probabilities of these values. > > I would like to sum the probabilities for each unique element in column > 1. For example: > > {{1, .5} , {2, .2} , {1, .1}} should give me: > > {{1, .6} , {2, .2}} > > > I'm sure I can do this with a "Do" loop -- however it seems that in > general "Do's" are pretty innefficient. > > Does anyone have any suggestions? > > Mitch > > Hi Mitch, how about tmp=Split[ Sort[ yourList, (#1[[1]]<#2[[1]])& ], SameQ[ #1[[1]], #2[[1]] ]& ] (*1*) sumP[a_List]:={#[[1,1]],Plus@@#[[2]]}&@Transpose[a] (*2*) sumP/@tmp (*3*) (1) will produce sublists of identical elements in the first position of your sublists - you have {{{i,pi1},...,{i,pin}},{{j,pj1},...,{j,pjm}},...}. (2) will take one of these sublists, extract the first element, sum over p and return {i, sum[pin]}. In (3) you map sumP on all the sublists of tmp, produced in (1), returning the desired output {{i,sum[pin]},{j,sum[pjm]}...} --- let's see what the other guys come up with...(probably something faster; at least my version is without "Do" <g>). So long, cheers, Peter