MATLAB: How to use splitapply when the applied function has non-scalar output

MATLABsplitapplytable

I am trying clean variables in a dataset, creating a new table variable, but splitapply does not seam to allow for nonscalar outputs of the function.
As a minimal working example, I have a table
myTable = table();
myTable.Gender = ["Male","Female","Male","Female"]';
myTable.Var1 = [1,2,3,4]';
And I am now trying to create a new table variable where the group mean is subtracted from "Var1" (yielding Var2 = [-1, -1, 1, 1])
When using splitapply(), I get the error
Error using splitapply (line 132)
The function '...' returned a non-scalar value when applied to the 1st group of data.
Is there a way to do this, also for function more involved than demeaning the input variables?
Thanks in advance,
Chris

Best Answer

OK, I reread the Q? and realize there was enough in it to see what it was that was wanted...
>> t=myTable; % shorter name; I'm lazy... :)
>> t.Gender=categorical(t.Gender); % gender is a categorical variable; treat it as such
>> fnMN=@(v) {v-mean(v)}; % have to encapsulate the return values as cell
>> splitapply(fnMN,t.Var1,g) % show what that returns is the cell array by group
ans =
2×1 cell array
{2×1 double}
{2×1 double}
>> cell2mat(ans) % and convert to the array form to see what values are...
ans =
-1
1
-1
1
>>
Now, the cell array is by group so to convert the cell array positioning to position in table :
grpmn=splitapply(fnMN,t.Var1,g); % the group mean-adjusted values
for i=1:numel(grpmn) % number of groups (2 here)
t.Var2(i==g)=grpmn{i}; % spread cell values over rows in table
end
Above results in:
>> t
t =
4×3 table
Gender Var1 Var2
______ ____ ____
Male 1 -1
Female 2 -1
Male 3 1
Female 4 1
>>