Организация больших наборов данных в Matlab

У меня проблема, надеюсь вы мне поможете.

Я импортировал большой набор данных (200000 x 5 ячеек) в Matlab, который имеет следующую структуру:

'Year' 'Country' 'X' 'Y' 'Value'

Столбцы 1 и 5 содержат числовые значения, а столбцы со 2 по 4 содержат строки.

Я хотел бы упорядочить всю эту информацию в переменную, которая имела бы следующую структуру:

NewVariable{Country_1 : Country_n , Year_1 : Year_n}(Y_1 : Y_n , X_1 : X_n)

Все, о чем я могу думать, это перебрать весь набор данных, чтобы найти совпадения между именами переменных Country, Year, X и Y, объединяющих функции if и strcmp, но это кажется самым неэффективным способом достижения того, что я пытаюсь сделать.

Может кто-нибудь мне помочь?

Заранее спасибо.


person aulky11    schedule 04.07.2016    source источник
comment
Сначала напишите что-нибудь, что работает, а об оптимизации позаботьтесь потом.   -  person excaza    schedule 04.07.2016
comment
Спасибо за подсказку excaza. Дело в том, что, вероятно, есть неизвестная мне функция, которую можно использовать для этого. В противном случае мне придется перебирать весь набор данных каждый раз, когда я хочу извлечь конкретное значение, и это не реальная альтернатива, если, например, вместо 200 000 записей у меня есть 5 миллионов.   -  person aulky11    schedule 04.07.2016
comment
о и есть! пожалуйста, взгляните на categorical()   -  person Finn    schedule 04.07.2016


Ответы (1)


Как упоминалось в комментариях, вы можете использовать категориальный массив:

% some arbitrary data:
country = repmat('ca',10,1);
country = [country; repmat('cb',10,1)];
country = [country; repmat('cc',10,1)];
T = table(repmat((2001:2005)',6,1),cellstr(country),...
    cellstr(repmat(['x1'; 'x2'; 'x3'],10,1)),...
    cellstr(repmat(['y1'; 'y2'; 'y3'],10,1)),...
    randperm(30)','VariableNames',{'Year','Country','X','Y','Value'});
% convert all non-number data to categorical arrays:
T.Country = categorical(T.Country);
T.X = categorical(T.X);
T.Y = categorical(T.Y);
% here is an example for using categorical array:
newVar = T(T.Country=='cb' & T.Year==2004,:);

Класс table создан для таких вещей и очень удобен. Просто расширьте логическое выражение в последней строке T.Country=='cb' & T.Year==2004, чтобы оно соответствовало вашим потребностям. Скажи мне, если это поможет ;)

person EBH    schedule 04.07.2016
comment
Спасибо за полезный ответ, @EBH! Импорт данных в виде таблицы и использование категориальной функции — это именно то, что мне было нужно. :-) - person aulky11; 05.07.2016