MATLAB - 使用具有多个类别的accumarray?

时间:2017-02-20 04:07:56

标签: matlab

我正在跟进我的问题here,其中有一个完美的解决方案,完全符合我的要求。但是我想知道如何应用这种方法,或者做类似的事情,如果不是可能的答案是肯定/否,我会有2个以上的答案,所以是/否/可能,例如。或者它如何推广到3+响应。

这就是答案,重新格式化为我的问题:

假设我的数据如下:

responses = categorical(randi(3,1250,1),[1 2 3],{'no','yes','maybe'});
race = categorical(randi(5,1250,1),1:5,{'Asian','Black','BHispanic','White','WHispanic'});

我想通过我的是/否数据来做同样的事情,但是这样做有3种可能性或更多。这不会再结束了:

% convert everything to numeric:
yn = double(responses); 
rac = double(race);
% caluculate all frequencies:
data = accumarray(rac,yn-1);
data(:,2) = accumarray(rac,1)-data;
% get the categories names:
races = categories(race);   
answers = categories(responses);
% plotting:
bar(data,0.4,'stacked');
ax = gca;
ax.XTickLabel = races; % set the x-axis ticks to the race names
legend(answers) % add a legend for the colors
colormap(lines(3)) % use nicer colors (close to your example)
ylabel('YES/NO/MAYBE')% set the y-axis label
% some other minor fixes:
box off
ax.YGrid = 'on';

我不确定是否有一种方法可以使用accumarray方法来做到这一点,因为根据我的理解,使用3种可能的响应是没有意义的。我也想将其推广到可能的答案中。

更新:我目前正在调查截至目前我根本找不到的交叉表功能!我认为这可能是我正在寻找的功能。

1 个答案:

答案 0 :(得分:0)

这是一个通用版本:

T = array2table(data.','VariableNames',races,'RowNames',answers)

结果:

bar

在表格中:

T = 
                  Asian    Black    BHispanic    White    WHispanic
                  _____    _____    _________    _____    _________
    no            58       72       69           66       62       
    yes           58       53       72           54       58       
    maybe         63       62       67           62       61   
    don't know    58       57       66           58       74      

输出:

crosstab

正如您已经提到的,您可以使用crosstab(rac,yn)执行相同的任务。 accumarray([rac yn],1)将为您提供与accumarray相同的结果。我认为{{1}}更快,但我没有检查它。