This question already has an answer here:

This seems like the sort of thing where Mathematica can give a very simple solution.

I have a list of points {x,y}:

{{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 5}}

From this list, I want to generate a new list of pairs {x,ymean}, where ymean is the average of all y's in the original list which were paired to the same value of x:

{{1, 3}, {2, 7/2}, {3, 5}}

What's the simplest, most elegant way to accomplish this in Mathematica?


marked as duplicate by Artes, Jens, Mr.Wizard May 15 '14 at 22:16

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 1
    $\begingroup$ Something involving GatherBy[list, First], I expect. $\endgroup$ – Rahul May 15 '14 at 18:19

Assuming you have your 2D list in a variable named lis, then the following should work:

Mean /@ GatherBy[lis, First]
  • $\begingroup$ +1 I knew my solution was too complicated... $\endgroup$ – becko May 15 '14 at 18:32
Replace[GatherBy[data, First], d_List :> {First@First@d, Mean[d[[All, 2]]]}, {1}]

where data is the original list of points.


Not the answer you're looking for? Browse other questions tagged or ask your own question.