Matlab: объединение наборов данных с не точными, но схожими значениями - PullRequest
0 голосов
/ 06 июля 2011

У меня есть два примера наборов данных, A и B ниже, к которым я хочу присоединиться в Matlab для создания C. Ключами будут «product» и «year», но проблема в том, что номер продукта в наборе данных B совпадает толькоодин в А по первым 4 цифрам.Есть ли способ объединить «почти» совпадающие числа таким образом?

A       
product tariff  year
202341  2       1999
202341  4       2000
202341  20      2008
202355  9       1999
202355  16      2000
438811  0       1999
438891  8       1999
438891  3       2001
671212  15      2005
671260  10      2005            

и

B       
product avg_tariff  year
2023    5,5         1999
2023    10          2000
2023    20          2008
4388    4           1999
4388    3           2001
6712    12,5        2005

объединены для получения матрицы C

C           
product tariff  year    avg_tariff
202341  2       1999    5,5
202341  4       2000    10
202341  20      2008    20
202355  9       1999    5,5
202355  16      2000    10
438811  0       1999    4
438891  8       1999    4
438891  3       2001    3
671212  15      2005    12,5
671260  10      2005    12,5

Спасибозаранее

Оскар

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Поскольку этот вопрос относится к предыдущему одному из ваших ответов, на которые я ответил, я повторно использую код и обновлю его до новых данных:

a.csv

product tariff  year
202341  2       1999
202341  4       2000
202341  20      2008
202355  9       1999
202355  16      2000
438811  0       1999
438891  8       1999
438891  3       2001
671212  15      2005
671260  10      2005

b.csv

product avg_tariff  year
2023    5.5         1999
2023    10          2000
2023    20          2008
4388    4           1999
4388    3           2001
6712    12.5        2005

Код MATLAB

(с использованием класса набора данных из панели инструментов статистики):

%# read A, and build dataset
fid = fopen('a.csv','rt');
C = textscan(fid, '%s%f%f', 'Delimiter',' ', 'MultipleDelimsAsOne',true, 'HeaderLines',1);
fclose(fid);
dA = dataset({C{1} 'product'}, {C{2} 'tariff'}, {C{3} 'year'});

%# read B, and build dataset
fid = fopen('b.csv','rt');
C = textscan(fid, '%s%f%f', 'Delimiter',' ', 'MultipleDelimsAsOne',true, 'HeaderLines',1);
fclose(fid);
dB = dataset({C{1} 'product'}, {C{2} 'avg_tariff'}, {C{3} 'year'});

%# truncate productA
dA.productLong = dA.product;
dA.product = cellfun(@(s)s(:,1:end-2), cellstr(dA.product), 'UniformOutput',false);

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

%# restore the long product number as first column, and sort by it
ds.product = ds.productLong;
ds.productLong = [];
ds = sortrows(ds, 'product')

Результат, как и ожидалось:

ds = 
    product         tariff    year    avg_tariff
    '202341'         2        1999     5.5      
    '202341'         4        2000      10      
    '202341'        20        2008      20      
    '202355'         9        1999     5.5      
    '202355'        16        2000      10      
    '438811'         0        1999       4      
    '438891'         8        1999       4      
    '438891'         3        2001       3      
    '671212'        15        2005    12.5      
    '671260'        10        2005    12.5   
0 голосов
/ 06 июля 2011

загрузите массив product и обработайте его как строки, используя textcan:

fidA = fopen('A.txt');
fidB = fopen('B.txt');
A = textscan(fidA,'%s%s%s','delimiter',' ');
B = textscan(fidB,'%s%s%s','delimiter',' ');
fclose(fidA);
fclose(fidB);

сохраните только первые 4 знака продукта в A

for i = 1:length(A{1})
   rowKeyA{i} = [A{1}{i}(1:4),A{3}{i}]; %product(1:4),year
end
for i = 1:length(B{1})
   rowKeyB{i} = [B{1}{i},B{3}{i}]; %product,year
end

, теперь просто найдите соответствия между rowKeyA иrowKeyB

for i = 1:length(rowKeyA)
    j = find(strcmp(rowKeyB,rowKeyA{i}),1);
    if(j)
       fprintf('%s %s %s\n',rowKeyA{i},A{2},B{2});
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...