В этом решении я буду использовать Массивы наборов данных из панели инструментов статистики.
Рассмотрим следующие два примера файлов 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