2014-12-03 3 views
1

У меня есть столбец со следующими данными:
Размер: 100x7
граф вхождений строк в колонке - Matlab

val = 

USA 
USA 
France 
USA 
France 

Я хочу, чтобы показать данные на круговой диаграмме. для этого мне нужно знать, сколько США приходится на эту колонку, и так далее.
Я читал о функциях уникальных, аккумулирующих, но я не успеваю
Я хотел бы получить некоторые предложения, как это сделать.
Спасибо.

ответ

3

Вы можете использовать unique с histc -

%// Get countries and their occurences 
[countries,~,id] = unique(cellstr(val),'stable') 
occurrences = histc(id,1:max(id)) 

Вы можете отобразить количество вхождений против имен стран в виде таблицы -

>> table(countries,occurrences) 
ans = 
    countries occurrences 
    _________ ___________ 
    'USA'  3   
    'France'  2  

Дисплей выходного в виде круговой диаграммы -

>> pie(occurrences,countries) 

enter image description here

+0

hahahahaha, сойдите с моей головы! +1 – rayryeng

+0

Ницца. Не знал о пироге. Это определенно должен быть принятым ответом. – rayryeng

+0

@rayryeng Googling помогает в эти дни! :) – Divakar

0

Это даст вам число вхождений с помощью регулярных выражений:

unique_countries = unique(regexp(val,'^.*$','lineanchors','match','dotexceptnewline')); 

count_unique_countries = zeros(size(unique_countries)); 
for ii = 1:numel(unique_countries) 
    count_unique_countries(ii) = numel(regexp(val,['^' unique_countries{ii} '$'],'lineanchors')); 
end 

Два выходных переменных теперь

unique_countries = 
'France' 'USA' 
count_unique_countries = 
1  2 
+0

Это находит только одну страну. Вопрос заключается в том, чтобы найти все страны. – rayryeng

+0

Чтобы сделать эту работу для всех стран, возможно, найдите все уникальные страны в списке, затем используйте 'regexp' и перейдите по каждой отдельной стране, но эффективность этого вопроса сомнительна по сравнению с' unique' с 'hist/accumarray'. – rayryeng

+0

Спасибо за комментарий. Я отредактировал решение, чтобы найти количество случаев для всех стран. Как вы заметили, сначала найдут уникальные страны с комбинацией уникальных и регулярных выражений. – ivan

4

Используйте третий выход unique, и убедитесь, что эти входные строки находятся в массиве cell. Третий вывод unique довольно крут, потому что он присваивает уникальный идентификатор для каждой уникальной величины, которая видна на входе. Таким образом, если у вас была последовательность символов от a до e, она назначила бы уникальный идентификатор для каждого уникального символа, который он нашел, между 1 и 5. Также первый вывод unique дает вам массив, который содержит только уникальные величины, которые видны на входе.

Вы можете использовать accumarray на этом третьем выходе, чтобы подсчитать, сколько раз вы видите конкретную страну по всем перечисленным странам.

val = {'USA'; 'USA'; 'France'; 'USA'; 'France'}; 
[countries,~,id] = unique(val); 
counts = accumarray(id, 1); 

я получаю:

counts = 

2 
3 

Также для countries:

countries = 

    'France' 
    'USA' 

Обратите внимание, что каждый элемент counts соответствует тому, сколько раз вы видите, что конкретная страна в том же положении, что и страна в countries, поэтому Франция виден 2 раза, а США 3 раза.

0

Если у вас есть набор инструментов статистики, вы также можете сделать следующее:

valnom = nominal(val); 
countries = getlabels(valnom); 
occurrences = levelcounts(valnom); 
Смежные вопросы