From: Ben Pfaff Date: Sat, 4 Jun 2022 23:07:43 +0000 (-0700) Subject: CTABLES work on distinguishing scale variables in summaries X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=121e99afcdd0847a75b9a9924145a4e8042f25a5 CTABLES work on distinguishing scale variables in summaries scale variables really are different for summarization This isn't quite ready, so it's going to be reverted for now. --- diff --git a/src/language/stats/ctables.c b/src/language/stats/ctables.c index fe46f10c92..f7b2691ac0 100644 --- a/src/language/stats/ctables.c +++ b/src/language/stats/ctables.c @@ -337,7 +337,7 @@ struct ctables_summary_spec_set size_t n; size_t allocated; - struct variable *var; + struct variable *scale_var; }; static void ctables_summary_spec_set_clone (struct ctables_summary_spec_set *, @@ -730,7 +730,7 @@ ctables_summary_spec_set_clone (struct ctables_summary_spec_set *dst, .specs = specs, .n = src->n, .allocated = src->n, - .var = src->var + .scale_var = src->scale_var }; } @@ -1975,9 +1975,9 @@ nest_fts (struct ctables_stack s0, struct ctables_stack s1) assert (n == allocate); const struct ctables_nest *summary_src; - if (!a->specs[CSV_CELL].var) + if (!a->specs[CSV_CELL].n && !a->specs[CSV_CELL].scale_var) summary_src = b; - else if (!b->specs[CSV_CELL].var) + else if (!b->specs[CSV_CELL].n && !b->specs[CSV_CELL].scale_var) summary_src = a; else NOT_REACHED (); @@ -2036,7 +2036,7 @@ enumerate_fts (enum pivot_axis_type axis_type, const struct ctables_axis *a) for (enum ctables_summary_variant sv = 0; sv < N_CSVS; sv++) { ctables_summary_spec_set_clone (&nest->specs[sv], &a->specs[sv]); - nest->specs[sv].var = a->var.var; + nest->specs[sv].scale_var = a->var.var; } return (struct ctables_stack) { .nests = nest, .n = 1 }; @@ -2228,7 +2228,7 @@ ctables_summary_uninit (union ctables_summary *s, static void ctables_summary_add (union ctables_summary *s, const struct ctables_summary_spec *ss, - const struct variable *var, const union value *value, + const struct variable *scale_var, const union value *value, double d_weight, double e_weight) { /* To determine whether a case is included in a given table for a particular @@ -2252,9 +2252,10 @@ ctables_summary_add (union ctables_summary *s, switch (ss->function) { case CTSF_COUNT: + case CSTF_TOTALN: case CTSF_VALIDN: - if (var_is_value_missing (var, value)) + if (scale_var && var_is_value_missing (scale_var, value)) s->missing += d_weight; else s->valid += d_weight; @@ -2285,7 +2286,7 @@ ctables_summary_add (union ctables_summary *s, case CTSF_MISSING: case CTSF_ETOTALN: case CTSF_EVALIDN: - if (var_is_value_missing (var, value)) + if (scale_var && var_is_value_missing (scale_var, value)) s->missing += e_weight; else s->valid += e_weight; @@ -2294,9 +2295,9 @@ ctables_summary_add (union ctables_summary *s, case CTSF_MAXIMUM: case CTSF_MINIMUM: case CTSF_RANGE: - if (!var_is_value_missing (var, value)) + if (!var_is_value_missing (scale_var, value)) { - assert (!var_is_alpha (var)); /* XXX? */ + assert (!var_is_alpha (scale_var)); /* XXX? */ if (s->min == SYSMIS || value->f < s->min) s->min = value->f; if (s->max == SYSMIS || value->f > s->max) @@ -2316,14 +2317,14 @@ ctables_summary_add (union ctables_summary *s, case CTSF_LAYERPCT_SUM: case CTSF_LAYERROWPCT_SUM: case CTSF_LAYERCOLPCT_SUM: - if (!var_is_value_missing (var, value)) + if (!var_is_value_missing (scale_var, value)) moments1_add (s->moments, value->f, e_weight); break; case CTSF_MEDIAN: case CTSF_MODE: case CTSF_PTILE: - if (var_is_value_missing (var, value)) + if (var_is_value_missing (scale_var, value)) { s->ovalid += e_weight; @@ -2845,8 +2846,12 @@ ctables_cell_add__ (struct ctables_section *s, const struct ccase *c, const struct ctables_summary_spec_set *specs = &ss->specs[cell->sv]; for (size_t i = 0; i < specs->n; i++) - ctables_summary_add (&cell->summaries[i], &specs->specs[i], specs->var, - case_data (c, specs->var), d_weight, e_weight); + { + const struct variable *scale_var = specs->scale_var; + const union value *value = scale_var ? case_data (c, scale_var) : NULL; + ctables_summary_add (&cell->summaries[i], &specs->specs[i], + scale_var, value, d_weight, e_weight); + } if (cell->contributes_to_domains) { for (enum ctables_domain_type dt = 0; dt < N_CTDTS; dt++) @@ -3805,16 +3810,14 @@ ctables_prepare_table (struct ctables_table *t) specs->n = 1; enum ctables_summary_function function - = specs->var ? CTSF_MEAN : CTSF_COUNT; - struct ctables_var var = { .is_mrset = false, .var = specs->var }; + = specs->scale_var ? CTSF_MEAN : CTSF_COUNT; + struct ctables_var var = { .var = specs->scale_var }; *specs->specs = (struct ctables_summary_spec) { .function = function, .format = ctables_summary_default_format (function, &var), .label = ctables_summary_default_label (function, 0), }; - if (!specs->var) - specs->var = nest->vars[0]; ctables_summary_spec_set_clone (&nest->specs[CSV_TOTAL], &nest->specs[CSV_CELL]); diff --git a/tests/language/stats/ctables.at b/tests/language/stats/ctables.at index 9d58441d88..dca260d0ad 100644 --- a/tests/language/stats/ctables.at +++ b/tests/language/stats/ctables.at @@ -708,7 +708,7 @@ AT_DATA([ctables.sps], [[GET 'nhtsa.sav'. CTABLES /TABLE=qn17 /CATEGORIES VARIABLES=qn17 TOTAL=YES LABEL='Number responding'. -CTABLES /TABLE=region > qn18 [MEAN, COUNT] +CTABLES /TABLE=region > qn18 [MEAN, COUNT, TOTALS [MEAN, COUNT, TOTALN]] /CATEGORIES VARIABLES=region TOTAL=YES LABEL='All regions'. ]]) AT_CHECK([pspp ctables.sps -O box=unicode -O width=80], [0], [dnl