我有一列包含每个参与者的组ID。有三个组,因此此列中的每个数字都是1,2或3.
然后我有第二列,其中包含每个参与者的回答分数。我想计算每组内的平均/中位反应分数。
我已经设法通过遍历每一行来做到这一点,但我觉得这是一个缓慢而次优的解决方案。有人可以建议一个更好的做事方式吗?
答案 0 :(得分:3)
grpstats
是一个很好用的函数(documentation here)
这是嵌入式统计信息的列表:
并且它也接受函数句柄(例如:@mean
,@skeweness
)
>> groups = [1 1 1 2 2 2 3 3 3]';
>> data = [0 0 1 0 1 1 1 1 1]';
>> grpstats(data, groups, {'mean'})
ans =
0.3333
0.6667
1.0000
>> [mea, med] = grpstats(data, groups, {'mean', @median})
mea =
0.3333
0.6667
1.0000
med =
0
1
1
答案 1 :(得分:2)
这是一个使用accumarray
(documentation和blog post)的好地方:
result = accumarray(groupIDs, data, [], @median);
您当然可以给出矩阵的行或列,而不是groupIDs
的变量和data
的另一个变量。如果您更喜欢均值而不是中位数,请使用@mean
作为第4个算法。
注意:文档指出,如果需要依赖输出的顺序,则应对输入参数进行排序。不过,我会把这项运动留给另一天。
答案 2 :(得分:1)
使用逻辑条件,例如说您的数据在矩阵m
中,如下所示:第一个col是ID
,第二个col是响应分数,
mean(m(m(:,1)==1,2))
median(m(m(:,1)==1,2))
会在响应分数等中为您提供1
的平均值和中位数