2017-02-20 1 views
1

Ich frage eine Follow-up meine Frage here, in der es eine perfekte Lösung gab, die genau das tat, was ich wollte. Aber ich frage mich, wie man diese Methode anwendet oder etwas Ähnliches macht, wenn ich anstelle von Ja/Nein als mögliche Antworten mehr als 2 Antworten hätte, also zum Beispiel ja/nein/vielleicht. Oder wie es sich auf 3+ Antworten verallgemeinern würde.MATLAB - Arbeiten mit Accumarray mit mehreren Kategorien?

Dies ist die Antwort, wie meine Frage umformatiert:

meine Daten sieht wie folgt aus der Annahme:

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'}); 

Ich möchte gehen und tun das gleiche mit meinem Ja/Nein-Daten, aber mach das mit 3 Möglichkeiten oder mehr. Und das wird nicht mehr am Ende arbeiten:

% 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'; 

Ich bin nicht sicher, ob es noch eine Möglichkeit, die accumarray Methode zu verwenden, um dies zu tun, da es keinen Sinn, aus meinem Verständnis macht dies die Verwendung mit 3 mögliche Antworten. Ich würde es gerne auf n mögliche Antworten verallgemeinern.

UPDATE: Ich untersuche gerade die Kreuztabellenfunktion, die ich bis jetzt überhaupt nicht gefunden habe! Ich denke, das könnte das Feature sein, nach dem ich suche. Hier

Antwort

0

ist eine verallgemeinerte Version:

% the data (with even more categories): 
yesno = categorical(randi(4,1250,1),1:4,{'no','yes','maybe','don''t know'}); 
race = categorical(randi(5,1250,1),1:5,{'Asian','Black','BHispanic','White','WHispanic'}); 
% convert everything to numeric: 
yn = double(yesno); 
rac = double(race); 
% caluculate all frequencies: 
data = accumarray([rac yn],1); 
% get the categories names: 
races = categories(race); 
answers = categories(yesno); 
% 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(numel(answers))) % use pretier colors 
ylabel('YES/NO')% set the y-axis lable 
% some other minor fixes: 
box off 
ax.YGrid = 'on'; 

Das Ergebnis:

bar

und in einer Tabelle:

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

die Ausgabe:

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  

Wie Sie bereits erwähnt haben, können Sie crosstab für die gleiche Aufgabe verwenden. crosstab(rac,yn) gibt Ihnen das gleiche Ergebnis wie accumarray([rac yn],1). Ich denke, accumarray ist schneller, obwohl ich es nicht überprüft habe.

Verwandte Themen