From 1a03ee5edcd30543fcce4ee32b1c8197ac01f0db Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 30 Jan 2022 22:10:55 -0800 Subject: [PATCH] work on adding empty categories --- src/language/stats/ctables.c | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index d6b5a0ca0c..12846d0c41 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -3312,9 +3312,53 @@ ctables_sort_clabels_values (struct ctables_table *t) t->clabels_values[i]->leaf = i; } +static void +add_empty_categories (struct ctables_table *t, const struct ccase *c, + size_t ix[PIVOT_N_AXES], + enum pivot_axis_type start_axis, size_t start_nest) +{ + for (enum pivot_axis_type a = start_axis; a < PIVOT_N_AXES; a++) + { + const struct ctables_nest *nest = &t->stacks[a].nests[ix[a]]; + for (size_t i = start_nest; i < nest->n; i++) + { + if (i == nest->scale_idx) + continue; + + const struct ctables_category *save = cats[a][i]; + if (save->subtotal) + { + cats[a][i] = save->subtotal; + ctables_cell_add__ (t, c, ix, cats, d_weight, e_weight); + recurse_subtotals (t, c, ix, cats, d_weight, e_weight, a, i + 1); + cats[a][i] = save; + } + } + start_nest = 0; + } +} + static bool ctables_execute (struct dataset *ds, struct ctables *ct) { + for (size_t i = 0; i < ct->n_tables; i++) + { + struct ctables_table *t = ct->tables[i]; + + for (size_t ir = 0; ir < t->stacks[PIVOT_AXIS_ROW].n; ir++) + for (size_t ic = 0; ic < t->stacks[PIVOT_AXIS_COLUMN].n; ic++) + for (size_t il = 0; il < t->stacks[PIVOT_AXIS_LAYER].n; il++) + { + size_t ix[PIVOT_N_AXES] = { + [PIVOT_AXIS_ROW] = ir, + [PIVOT_AXIS_COLUMN] = ic, + [PIVOT_AXIS_LAYER] = il, + }; + + add_empty_categories (t, ix, 0, 0); + } + } + struct casereader *input = proc_open (ds); bool warn_on_invalid = true; for (struct ccase *c = casereader_read (input); c; -- 2.30.2