how to sum the elements of the same row in a cell array?

Hello guys,
I ave a cell array of 1450 rows and 2 columns(1450*2)
Some rows in column 1 are repeated but with different contents in column2
How can i get these repeated rows in sigle row with the sum of their contents ?
I appreciate any helps:
Inputs:
Inputs.png
wanted_outputs:
Iwanted_outputs.png

2 Comments

Attach the original data....you need to sue unique

Sign in to comment.

 Accepted Answer

Stephen23
Stephen23 on 13 Dec 2018
Edited: Stephen23 on 13 Dec 2018
>> C = {'A','hello';'B','live';'C','cat';'A','world';'B','fast'}‡
C =
'A' 'hello'
'B' 'live'
'C' 'cat'
'A' 'world'
'B' 'fast'
>> [U,~,X] = unique(C(:,1));
>> F = @(n) C(n==X,2).';
>> V = arrayfun(F,1:max(X),'uni',0);
>> Z = [U,V(:)]
Z =
'A' {'hello','world'}
'B' {'live','fast'}
'C' {'cat'}

3 Comments

@Stephen Cobeldick Thanks for yr great effort and help!
Now, no error but the results i got is wrong, i checked manually some!
@Stephen Cobeldick see what i got for my data just tested one line?
'R-HSA-3000171:R-HSA-3000171' 1x4 cell
This row should have
'R-HSA-3000171:R-HSA-3000171' 'PDGFB, TTR, COL4A6,LAMA1,COL4A5 ,COL11A2,COL3A1'
Yr example is sample.
@chocho: You can easily concatenate those character vectors together, if that is what you want to do, just change the anonymous function:
>> F = @(n) [C{n==X,2}];
>> V = arrayfun(F,1:max(X),'uni',0);
>> Z = [U,V(:)]
Z =
'A' 'helloworld'
'B' 'livefast'
'C' 'cat'
Or perhaps you want to join them with commas, this is also easy:
>> F = @(n) sprintf('%s, ',C{n==X,2});
>> V = arrayfun(F,1:max(X),'uni',0);
>> Z = [U,strtrim(V(:))]
Z =
'A' 'hello, world,'
'B' 'live, fast,'
'C' 'cat,'

Sign in to comment.

More Answers (1)

KSSV
KSSV on 13 Dec 2018
Edited: KSSV on 13 Dec 2018
C = cell(5,2) ;
C{1,1} = 'apple' ; C{1,2} = 'red' ;
C{2,1} = 'apple' ; C{2,2} = 'round' ;
C{3,1} = 'grapes' ; C{3,2} = 'green' ;
C{4,1} = 'strawberry' ; C{4,2} = 'sweet' ;
C{5,1} = 'grapes' ; C{5,2} = 'small' ;
%
[c,ia,ib] = unique([C(:,1)]) ;
iwant = cell(length(c),2) ;
for i = 1:length(c)
iwant{i,1} = c{i} ;
iwant{i,2} = strjoin(C(ib==i,2)) ;
end

4 Comments

@KSSV i got this error by using yr code
Error using strjoin (line 52)
First input must be a 1xN cell array of strings.
Error in filee (line 53)
iwant{i,2} = strjoin(C(ib==i,2)) ;
@KSSV Yep, It works now but columns 2 elements are separated by ',' ?
I got some thing like this
'R-HSA-3000171:R-HSA-3000171' 'PDGFB TTR COL4A6,LAMA1,COL4A5 COL11A2,COL3A1'
They should be like this
'R-HSA-3000171:R-HSA-3000171' 'PDGFB, TTR, COL4A6,LAMA1,COL4A5 ,COL11A2,COL3A1'
KSSV Could you update yr code to got my iwant plz i want the ',' between in ?
without it i can't continue my work!
I see that he asked for your data (which you could attach in a .mat file with the paper clip icon) and you chose not to. If you make it easy for people to help you, not hard, then you'd get an answer sooner - you'd probably have had the solution by now.

Sign in to comment.

Categories

Asked:

on 13 Dec 2018

Commented:

on 13 Dec 2018

Community Treasure Hunt

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

Start Hunting!