0

我有以下类型的单元格数组:

 datABC =
           [45]  [67]  'A'
           [34]  [44]  'A'
           [11]  [84]  'A'
           [23]  [68]  'A'
           [34]  [44]  'B'
           [30]  [94]  'B'
           [304]  [414]  'C'
           [78]  [110]  'C'
           [34]  [120]  'C'

现在我必须根据A, B&计算第一列和第二列的观察次数和平均值C

提前致谢。

4

3 回答 3

2

看起来像一份工作accumarray

[categories ii jj] = unique(dataABC(:,3));
num = histc(jj,1:max(jj));
mean1 = accumarray(jj, cell2mat(dataABC(:,1)), [], @mean);
mean2 = accumarray(jj, cell2mat(dataABC(:,2)), [], @mean);

例子:

>> dataABC{4,2}

dataABC = 

    [1]    [10]    'A' 
    [2]    [-5]    'B' 
    [3]    [15]    'A' 
    [4]    [40]    'CC'

categories = 

    'A'
    'B'
    'CC'

>> num

num =

     2
     1
     1

>> mean1

mean1 =

     2
     2
     4

>> mean2

mean2 =

   12.5000
   -5.0000
   40.0000
于 2013-11-14T08:38:23.353 回答
2

眼看着闸门打开了,我还不如投入我的两分钱。

带有循环的解决方案效果很好,但您也可以消除循环,但会牺牲可读性。首先,您可以使用以下命令获取最后一列中的唯一值unique

stringKeys = unique(datABC(:,3))'

然后您可以使用匿名函数cellfun计算每个键的出现次数:

memberFun = @(x) ismember(datABC(:,3),x);
keyOccurrences = cellfun(@(x) nnz(memberFun(x)),stringKeys)

要计算前两列中每一列的相应数据的平均值,您可以再次使用cellfun非均匀输出:

colMeanFun = @(x) mean(reshape([datABC{memberFun(x),1:2}],[],2),1);
colMeans = cellfun(colMeanFun,stringKeys,'UniformOutput',false);
colMeans = vertcat(colMeans{:})

也看看 ate strcmpmi,它可以用来代替ismember但会忽略大小写。

测试数据

datABC = {[45]  [67]  'A'; [34]  [44]  'A'; [11]  [84]  'A'; ...
          [23]  [68]  'A'; [34]  [44]  'B'; [30]  [94]  'B'; ...
          [304] [414] 'C'; [78]  [110] 'C'; [34]  [120] 'C'}; % 9-by-3
于 2013-11-14T02:18:59.867 回答
1

熟悉逻辑索引

for x = unique(datABC(:,3))'
    idx = strcmp(x, datABC(:, 3));
    disp([x{1} ': ' num2str(sum(idx)) ' observations'])
    disp(mean(cell2mat(datABC(idx, 1:2))))
end
于 2013-11-14T01:56:41.470 回答