Average of subgroup of 2nd column, grouped by 1st column

北城以北 提交于 2019-11-28 11:54:09

问题


Suppose I have matrix A. 1st column is "group". Then I want to calculate the average of 2nd column for each group. So I want to create B.

A=
 1  2
 1  3
 2  4
 2  2

B=
 1  2.5
 2  3

The best thing I did until now is to construct a long for and if loop and use average function to get to B.

But I guess there will be more simple method. Is there?


回答1:


I hadn't used accumarray before, so due to the comment by @Dan I decided to give it a try.

At first I tried a naive version and used histc to count occurrences to get the desired mean values... (Note that accumarray will sort the output the same order as unique, so mean will be calculated correctly)

%// Naive version
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values)
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA);

Here, accumarray operates by summing over all entries in A(:,2) corresponding to identical subscripts in A(:,1).

But then I realised that by passing the optional fun argument to accumarray changing "summing" to "mean", you can do this as a one-liner:

%// one-liner
result = accumarray(A(:,1), A(:,2), [], @mean);


来源:https://stackoverflow.com/questions/33886945/average-of-subgroup-of-2nd-column-grouped-by-1st-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!