在MATLAB中计算组均值/中位数,其中组ID在单独的列中

时间:2013-01-22 10:09:41

标签: matlab

我有一列包含每个参与者的组ID。有三个组,因此此列中的每个数字都是1,2或3.

然后我有第二列,其中包含每个参与者的回答分数。我想计算每组内的平均/中位反应分数。

我已经设法通过遍历每一行来做到这一点,但我觉得这是一个缓慢而次优的解决方案。有人可以建议一个更好的做事方式吗?

3 个答案:

答案 0 :(得分:3)

grpstats是一个很好用的函数(documentation here

这是嵌入式统计信息的列表:

  • '表示'平均值
  • 'sem'平均值的标准误差
  • 'numel'非NaN元素的数量或数量
  • 'gname'群组名称
  • 'std'标准偏差
  • 'var'Variance
  • 'min'最低
  • 'max'最大值
  • 'range'Range
  • 'meanci'平均值的95%置信区间
  • 'predci'新观察的95%预测间隔

并且它也接受函数句柄(例如:@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)

这是一个使用accumarraydocumentationblog 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的平均值和中位数