Create new variable if elements of different variables match in Matlab

1 visualizzazione (ultimi 30 giorni)
I have 3 cell arrays: A that has 3 columns and 5000 rows. B that has 5 and 60 columns. C that has 4 columns and 500 rows. Sample of each varaible:
A= { 12 1999 41.2
13 1999 47.7
16 1999 52.7}
B= { 16 452 8 407 31
1037 110 14 873 93
1255 881 20 16 69}
C= { 13 1997 1999 2000
141 1997 1999 2000
174 1997 1999 2000}
If a value of the 1st column of A matches any value of the 1st column of B , I would like to add to A, columns 1, 4 and 5 of B plus a column only with the value 'one' . In case a value of the 1st column of A matches a value of the 1st column of C, I would like to add to A, columns 1 and 4 of C and an extra column with zeroes.
So the output would be:
Output= { 12 1999 41.2
13 1999 47.7 13 2000 0 %match between A & C
16 1999 52.7 16 407 31 1} %match between A & B
Can someone help me? Thank you.

Risposta accettata

Azzi Abdelmalek
Azzi Abdelmalek il 4 Ago 2014
Modificato: Azzi Abdelmalek il 5 Ago 2014
EDIT
a1=[A{:,1}];
b1=[B{:,1}];
c1=[C{:,1}];
n=numel(a1);
out=cell(n,7);
out(:,1:3)=A;
ii=[ismember(a1,b1)' ismember(a1,c1)'];
for k=1:numel(a1)
if ii(k,1)==1;
ib=find(b1==a1(k),1)
out(k,4:7)=[B(ib,[1 4 5]) {1}];
elseif ii(k,2)==1
ic=find(c1==a1(k),1);
out(k,4:6)=[C(ic,[1 4]) {0} ];
end
end
out
  6 Commenti
Maria
Maria il 5 Ago 2014
The code stops running the first time there is a match between A and B. The first 24 rows are matches between A and C and it works. Then it gives the error.

Accedi per commentare.

Più risposte (1)

Ben11
Ben11 il 4 Ago 2014
Here is something to get you started. It's not the most elegant but I think it answers your question. Note that I added NaN in some case in order to keep dimensions consistent.
clear
clc
A= { 12 1999 41.2
13 1999 47.7
16 1999 52.7};
B= { 16 452 8 407 31
1037 110 14 873 93
1255 881 20 16 69};
C= { 13 1997 1999 2000
141 1997 1999 2000
174 1997 1999 2000};
A = cell2mat(A); % transform cell arrays into numeric arrays
B = cell2mat(B);
C = cell2mat(C);
CommonValuesIndicesBinA= find(ismember(A(:,1),B(:,1))) % find indices in A corresponding to matching values in B.
CommonValuesIndicesAinB= find(ismember(B(:,1),A(:,1))) % find indices in B corresponding to matching values in A.
CommonValuesIndicesCinA = find(ismember(A(:,1),C(:,1))); % find indices in A corresponding to matching values in C.
CommonValuesIndicesAinC = find(ismember(C(:,1),A(:,1))); % find indices in C corresponding to matching values in A.
A(CommonValuesIndicesBinA,4:7) = [ B(CommonValuesIndicesAinB,1) B(CommonValuesIndicesAinB,4) B(CommonValuesIndicesAinB,5) 1]; % Add values in A with those you want from B
A(CommonValuesIndicesCinA,4:7) = [ C(CommonValuesIndicesAinC,1) C(CommonValuesIndicesAinC,4) 0 NaN]; % Add values in A with those you want from C. Add NaN at last entry to keep dimensions consistent
  7 Commenti
Maria
Maria il 5 Ago 2014
And I tried with the sample I provided here and it works, but when I do it with my data it does not work!
Ben11
Ben11 il 5 Ago 2014
I modified the last part with this and I think it should work
for k =1:size(CommonValuesIndicesBinA,1)
p = CommonValuesIndicesBinA(k);
A(p,4:7) = [ B(CommonValuesIndicesAinB(k),1) B(CommonValuesIndicesAinB(k),4) B(CommonValuesIndicesAinB(k),5) 1]; % Add values in A with those you want from B
end
for kk =1:size(CommonValuesIndicesCinA,1)
pp = CommonValuesIndicesCinA(kk);
A(pp,4:7) = [ C(CommonValuesIndicesAinC(kk),1) C(CommonValuesIndicesAinC(kk),4) 0 NaN]; % Add values in A with those you want from C. Add NaN at last entry to keep dimensions consistent
end

Accedi per commentare.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by