Weighted mean by groups

13 vues (au cours des 30 derniers jours)
Maximilian  Schwarz
Maximilian Schwarz le 28 Sep 2022
Modifié(e) : dpb le 28 Sep 2022
I am trying to get the weighted mean of values by group id but I don't undersnatnd why my ouput (Mean) is a matrix and not a vector.
id = { 'a'; 'a'; 'b'; 'b'; 'c'; 'c'};
values = [1;2;3;4;5;6];
weights = [0.5;0.7;0.3;0.4;0.5;0.1];
exampletable = table(id, weights, values);
G = findgroups(exampletable.id);
wmean = @(w,v)w'.*mean(v);
Mean = splitapply(wmean, exampletable.weights, exampletable.values, G)
id = { 'a'; 'a'; 'b'; 'b'; 'c'; 'c'};
values = [1;2;3;4;5;6];
weights = [0.5;0.7;0.3;0.4;0.5;0.1];
exampletable = table(id, weights, values);
G = findgroups(exampletable.id);
wmean = @(w,v)w'.*mean(v);
Mean = splitapply(wmean, exampletable.weights, exampletable.values, G)

Réponse acceptée

dpb
dpb le 28 Sep 2022
Modifié(e) : dpb le 28 Sep 2022
It's the wmean function definition that's doing it -- what you intended was
wmean = @(w,v)mean(w.*v);
trying that,
id = { 'a'; 'a'; 'b'; 'b'; 'c'; 'c'};
values = [1;2;3;4;5;6];
weights = [0.5;0.7;0.3;0.4;0.5;0.1];
exampletable = table(id, weights, values);
G = findgroups(exampletable.id);
Mean = splitapply(wmean, exampletable.weights, exampletable.values, G)
Mean = 3×1
0.9500 1.2500 1.5500
ADDENDUM
OBTW, you can do things like this without the explicit step of findgroups with groupsummary (or several other ways, as well)--
gmeans=groupsummary(exampletable,'id',wmean,{"weights","values"})
gmeans = 3×3 table
id GroupCount fun1_weights_values _____ __________ ___________________ {'a'} 2 0.95 {'b'} 2 1.25 {'c'} 2 1.55
  1 commentaire
Maximilian  Schwarz
Maximilian Schwarz le 28 Sep 2022
Thanks!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Descriptive Statistics and Visualization 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!

Translated by