Сортировка данных в Matlab - PullRequest
2 голосов
/ 22 июня 2011

Я хочу сопоставить номер продукта (столбец 1) и год (столбец 2) для страны A с тем же продуктом и годом для страны B, чтобы иметь возможность вычесть соответствующие торговые номера (столбец 3 минус столбец 6) длястраны в этом году и в этом продукте.Когда аналог не найден, я хочу, чтобы этот пост был выброшен.

В примере, приведенном ниже по ссылке, я делал это вручную до строки 22 (кроме вычитания торговых показателей).Например, в строке ниже (23) говорится, что продукт 030420 был продан в 1995 году по значению 2,823, но в этом году в стране B не было зарегистрировано никакой торговли этим продуктом, поэтому эту публикацию я хочу удалить.Соответственно, в стране B торговля продуктом 030420 зарегистрирована в 1994 году, но в стране A аналога нет, поэтому сообщение также следует удалить.

Даже если данные в приведенном ниже примере показаны в Excel(Я попытался решить эту проблему в Excel, но это оказалось непросто) Теперь у меня есть данные, хранящиеся в матрице в Matlab, и я хочу написать для них код, но я довольно новичок в Matlab / coding.На словах это может быть что-то вроде:

  • ЕСЛИ первая запись в столбце 1 = любая запись в столбце 4
  • , то также ЕСЛИ первая запись в столбце 2 = любая запись в столбце 5,вычтите значение сделки (столбец 6, где бы он ни находился) из первой записи в столбце 3.
  • Если совпадений не найдено, я бы хотел, чтобы программа выбросила этот пост, как описано выше.

И затем, конечно, повторите процедуру для остальной части образца.

Пример:

http://img228.imageshack.us/img228/1214/skrmavbild20110609kl092.png

Если кому-то хочется прочитатьэто короткое эссе и есть какие-либо предложения, это будет высоко ценится.

1 Ответ

2 голосов
/ 22 июня 2011

В этом решении я буду использовать Массивы наборов данных из панели инструментов статистики.

Рассмотрим следующие два примера файлов CSV (аналогично вашему файлу Excel, но я разделил две страны на отдельные файлы):

countryA.csv

ProductCode,Year,TradeValue
011111,1992,5.934
011111,1999,7.05
022222,2002,5.2
033333,2005,16.6
033333,2006,55

countryB.csv

ProductCode,Year,TradeValue
011111,1992,24.5
011111,1999,25
033333,2005,33.11
033333,2006,44.92
044444,2010,10.8

Приведенный ниже код читает два набора данных и выполняет внутреннее соединение , используя (ProductCode, Year) в качестве ключей строки, затем мы вычисляем разницу двух торговых значений для соответствующих строк:

%# read datasets (note we are reading ProductCode/Year as strings to preserve leading zeros)
dA = dataset('File','countryA.csv', 'Delimiter',',', 'Format','%s %s %f','ReadVarNames',true);
dB = dataset('File','countryB.csv', 'Delimiter',',', 'Format','%s %s %f','ReadVarNames',true);

%# inner join (keep only rows that exist in both datasets)
ds = join(dA, dB, 'keys',{'ProductCode' 'Year'}, 'type','inner', 'MergeKeys',true);

%# add a new variable for the difference
dsTradeDiff = dataset(ds.TradeValue_left - ds.TradeValue_right, 'VarNames','TradeDifference');
ds = cat(2, ds, dsTradeDiff);

Полученный набор данных:

ds = 
    ProductCode     Year          TradeValue_left    TradeValue_right    TradeDifference
    '011111'        '1992'        5.934               24.5               -18.566        
    '011111'        '1999'         7.05                 25                -17.95        
    '033333'        '2005'         16.6              33.11                -16.51        
    '033333'        '2006'           55              44.92                 10.08   

РЕДАКТИРОВАТЬ: Это альтернативный способ достижения того же, что и выше, используя только основные встроенные функции MATLAB:

%# read countryA
fid = fopen('countryA.csv','rt');
C = textscan(fid, '%s %s %f', 'Delimiter',',', 'HeaderLines',1);
fclose(fid);
[prodCodeA yearA tradeValA] = deal(C{:});

%# read countryB
fid = fopen('countryB.csv','rt');
C = textscan(fid, '%s %s %f', 'Delimiter',',', 'HeaderLines',1);
fclose(fid);
[prodCodeB yearB tradeValB] = deal(C{:});

%# build rows merged-keys
keysA = strcat(prodCodeA,yearA);
keysB = strcat(prodCodeB,yearB);

%# match rows
[idx1 loc1] = ismember(keysA,keysB);
[idx2 loc2] = ismember(keysB,keysA);

%# compute result for intersection of rows
tradeDiff = tradeValA(loc2(idx2)) - tradeValB(loc1(idx1))

с тем же результатом:

tradeDiff =
      -18.566
       -17.95
       -16.51
        10.08
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...