Create new variable if elements of different variables match in Matlab
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Maria
le 4 Août 2014
Commenté : Azzi Abdelmalek
le 5 Août 2014
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.
Réponse acceptée
Azzi Abdelmalek
le 4 Août 2014
Modifié(e) : Azzi Abdelmalek
le 5 Août 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 commentaires
Plus de réponses (1)
Ben11
le 4 Août 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 commentaires
Ben11
le 5 Août 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
Voir également
Catégories
En savoir plus sur Whos dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!