anonymous function w/ accumarray

tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]', 'VariableNames',{'year','id'})
Hi
I got error message below. Could you help shed light why I can't use accumarray with concatinating text output?
year id
____ __
1 1
1 5
1 9
2 10
2 1
cat = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
However got error below when trying to call
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt= accumarray( JGrp, tdata.id, [], @cat);
Error using cat
Dimension argument must be a real, positive, integer scalar.

 Accepted Answer

Naming your function ‘cat’ overshadows the existing MATLAB function by that name, that you inadvertently called when you used the ‘@’ operator in the accumarray call. First, rename the anonymous function, and do not use the ‘@’ in the accumarray call when calling it, since it is already a function handle.
This slight variation on the original code works:
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]', 'VariableNames',{'year','id'})
tdata = 5×2 table
year id ____ __ 1 1 1 5 1 9 2 10 2 1
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt= accumarray( JGrp, tdata.id, [], catfcn)
tt = 2×1 cell array
{'1,5,9'} {'10,1' }
.

6 Comments

Thanks very much
As always, my pleasure!
How can i do this operation with the string type variable? say another variable is "name" with values
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',["a" "b" "c" "d" "e"]', 'VariableNames',{'year','id','name'})
then the accumarray should return
accumarray( JGrp, tdata.name, [], catfcn)
{'a,b,c}
{d,e}
The accumarray function only works with numeric values and character vectors, so your example code requires one small change —
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',['a' 'b' 'c' 'd' 'e']', 'VariableNames',{'year','id','name'})
tdata = 5×3 table
year id name ____ __ ____ 1 1 a 1 5 b 1 9 c 2 10 d 2 1 e
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt = accumarray( JGrp, tdata.name, [], catfcn)
tt = 2×1 cell array
{'a,b,c'} {'d,e' }
Then, it works!
.
Pete sherer
Pete sherer on 22 Aug 2022
Edited: Pete sherer on 22 Aug 2022
I tried using the cellstr() to apply to the string-type variable before using the step above but it didn't work.
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',["a" "b" "c" "d" "e"]', 'VariableNames',{'year','id','name'});
tdata.name= cellstr( tdata.name);
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt = accumarray( JGrp, tdata.name, [], catfcn)
Error using accumarray
Second input VAL must be a full numeric, logical, or char vector or scalar.
It doesn’t work because it remains a cell array. Use the char function instead —
tdata = table([ 1 1 1 2 2]', [1 5 9 10 1]',["a" "b" "c" "d" "e"]', 'VariableNames',{'year','id','name'});
% tdata.name= cellstr( tdata.name)
tdata.name = char(tdata.name)
tdata = 5×3 table
year id name ____ __ ____ 1 1 a 1 5 b 1 9 c 2 10 d 2 1 e
catfcn = @(x) {sprintf([repmat('%s,',1,length(x)-1) '%s'], string(x))};
[ uniqYr,~,JGrp] = unique( tdata(:,'year'));
tt = accumarray( JGrp, tdata.name, [], catfcn)
tt = 2×1 cell array
{'a,b,c'} {'d,e' }
.

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2021a

Tags

Community Treasure Hunt

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

Start Hunting!