Count unique categorical values in table

My table consist of only categorical values. I try to find unique elements and how many times do they appear in my table. Not my actual data but following can be used instead:
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
FirstName = {'Amanda' ;'Brenda';'Carl'; 'Denis'; 'Ethan'};
Something = {'String1' ;'String2';'String2'; 'String1'; 'String5'};
Weight = [176;163;131;133;119];
FavoriteColor = {'blue' ;'red' ;'yellow'; 'orange' ;'colorblind' };
T = table(Age,FirstName,Weight,FavoriteColor,Something,'RowNames',LastName)
T.FavoriteColor= categorical(T.FavoriteColor);
T.Something= categorical(T.Something);
I think It is similar to the idea of applying a histogram function so I tried it as well but the data being categorical makes it hard. Could you help?

2 Kommentare

Azzi Abdelmalek
Azzi Abdelmalek am 25 Okt. 2014
What is tNonNumeric? what type of variable?
Ege
Ege am 25 Okt. 2014
Bearbeitet: Ege am 25 Okt. 2014
tNonNumeric is a table which has categorical values in it.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Mohammad Abouali
Mohammad Abouali am 25 Okt. 2014

1 Stimme

something like this:
First your code to generate sample data:
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
FirstName = {'Amanda' ;'Brenda';'Carl'; 'Denis'; 'Ethan'};
Something = {'String1' ;'String2';'String2'; 'String1'; 'String5'};
Weight = [176;163;131;133;119];
FavoriteColor = {'blue' ;'red' ;'yellow'; 'orange' ;'colorblind' };
T = table(Age,FirstName,Weight,FavoriteColor,Something,'RowNames',LastName)
T.FavoriteColor= categorical(T.FavoriteColor);
T.Something= categorical(T.Something);
now getting the unique values
unqValue=unique(T.Something);
Now counting
n=arrayfun(@(x) sum(T.Something==x),unqValue);
Now plotting
bar(n)
Now first changing the unqValue from categorical to Cell array and then adding it as labels to the bar chart
unqValueCell=arrayfun(@(x) char(x(1)),unqValue,'UniformOutput',false);
set(gca,'XTickLabel',unqValueCell)
Here is the bar chart:

Weitere Antworten (2)

Image Analyst
Image Analyst am 25 Okt. 2014

0 Stimmen

For some reason you chose to use the original poster's code which he said wasn't working rather than either of the two answers that worked. Why? Why not try to use one of the scripts that worked?

3 Kommentare

Ege
Ege am 25 Okt. 2014
He had these working, what he wanted is to find the "maximum value from the list" which is not my concern
Image Analyst
Image Analyst am 25 Okt. 2014
What he needed was the histogram. Both answers had that but his original code did not . You can use one of the Answers or try Azzi's code here.
Ege
Ege am 25 Okt. 2014
Bearbeitet: Ege am 25 Okt. 2014
Ok I figured the histogram too and Azzi's answer works well for numerical values but if we add a categorical column to it it gives error.
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
FirstName = {'Amanda' ;'Brenda';'Carl'; 'Denis'; 'Ethan'};
Something = {'String1' ;'String2';'String2'; 'String1'; 'String5'};
Weight = [176;163;131;133;119];
FavoriteColor = {'blue' ;'red' ;'yellow'; 'orange' ;'colorblind' };
T = table(Age,FirstName,Weight,FavoriteColor,Something,'RowNames',LastName)
T.FavoriteColor= categorical(T.FavoriteColor);
T.Something= categorical(T.Something);
a=T.Something
[uniq,jj,kk]=unique(a)
freq=histc(kk,1:numel(uniq))
out=[uniq freq]
the result:
a =
'String1'
'String2'
'String2'
'String1'
'String5'
uniq =
'String1'
'String2'
'String5'
jj =
1
2
5
kk =
1
2
2
1
3
freq =
2
2
1
Error using horzcat Dimensions of matrices being concatenated are not consistent.

Melden Sie sich an, um zu kommentieren.

Azzi Abdelmalek
Azzi Abdelmalek am 25 Okt. 2014

0 Stimmen

Look at this example
LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;40];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
tNonNumeric = table(Age,Height,Weight,BloodPressure,'RowNames',LastName)
%---------------------------------------------------------------------------
a=tNonNumeric.Age
[uniq,jj,kk]=unique(a)
freq=histc(kk,1:numel(uniq))
out=[uniq freq]

7 Kommentare

I am getting
Error using categorical/cat (line 56)
Can not concatenate a double array and a categorical array.
Error in categorical/horzcat (line 21)
a = cat(2,varargin{:});
Image Analyst
Image Analyst am 25 Okt. 2014
I don't even see cat in Azzi's code. What are you doing?
Ege
Ege am 25 Okt. 2014
because I use it in my actual table tNonNumeric which only consists of categorical values.
Azzi Abdelmalek
Azzi Abdelmalek am 25 Okt. 2014
To make things easier, post a sample of your data
Image Analyst
Image Analyst am 25 Okt. 2014
If they're strings, the sizes are probably different so you'll have to create a cell array instead of a character array, which must be rectangular. See http://matlab.wikia.com/wiki/FAQ#What_is_a_cell_array.3F
Ege
Ege am 25 Okt. 2014
I edited the question and added some sample data hope that helps
Azzi Abdelmalek
Azzi Abdelmalek am 25 Okt. 2014
What is your question for the new example? what column? the first? or all the columns at the same time?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Characters and Strings finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by