第 2 列子组的平均值,按第 1 列分组
Average of subgroup of 2nd column, grouped by 1st column
假设我有矩阵 A。第一列是 "group"。然后我想计算每组第二列的平均值。所以我想创建B.
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
到目前为止我做的最好的事情是构造一个长的 for 和 if 循环并使用 average 函数到达 B。
但我想会有更简单的方法。有吗?
我以前没有用过accumarray
,所以由于@Dan 的评论我决定试一试。
起初我尝试了一个简单的版本并使用 histc
来计算出现次数以获得所需的平均值...(请注意,accumarray 将按照与 unique
相同的顺序对输出进行排序,所以均值将被正确计算)
%// Naive version
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values)
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA);
此处,accumarray
通过对 A(:,2)
中对应于 A(:,1)
.
中相同下标的所有条目求和来进行运算
但后来我意识到,通过将可选的 fun
参数传递给 accumarray
,将 "summing" 更改为 "mean",您可以单行执行此操作:
%// one-liner
result = accumarray(A(:,1), A(:,2), [], @mean);
假设我有矩阵 A。第一列是 "group"。然后我想计算每组第二列的平均值。所以我想创建B.
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
到目前为止我做的最好的事情是构造一个长的 for 和 if 循环并使用 average 函数到达 B。
但我想会有更简单的方法。有吗?
我以前没有用过accumarray
,所以由于@Dan 的评论我决定试一试。
起初我尝试了一个简单的版本并使用 histc
来计算出现次数以获得所需的平均值...(请注意,accumarray 将按照与 unique
相同的顺序对输出进行排序,所以均值将被正确计算)
%// Naive version
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values)
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA);
此处,accumarray
通过对 A(:,2)
中对应于 A(:,1)
.
但后来我意识到,通过将可选的 fun
参数传递给 accumarray
,将 "summing" 更改为 "mean",您可以单行执行此操作:
%// one-liner
result = accumarray(A(:,1), A(:,2), [], @mean);