X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffrequencies.q;fp=src%2Flanguage%2Fstats%2Ffrequencies.q;h=8b256c78a78aa7cff57669e154e036738732a6f7;hb=e21291cb901adb36d6e44bbe19f845202908e608;hp=c360713b56689800caaf9c2dadc5aea1b3f3d206;hpb=f8022db2c3c692c2c7c31c4c20743ef56e8066d4;p=pspp diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q index c360713b56..8b256c78a7 100644 --- a/src/language/stats/frequencies.q +++ b/src/language/stats/frequencies.q @@ -49,6 +49,7 @@ #include "output/chart-item.h" #include "output/charts/piechart.h" #include "output/charts/plot-hist.h" +#include "output/pivot-table.h" #include "output/tab.h" #include "gl/minmax.h" @@ -162,6 +163,7 @@ struct frq_chart struct freq_tab { struct casewriter *sorter; + struct casereader *data; struct freq *valid; /* Valid freqs. */ int n_valid; /* Number of valid freqs. */ @@ -596,6 +598,7 @@ postprocess_freq_tab (const struct frq_proc *frq, struct var_freqs *vf) /* Extract data from hash table. */ reader = casewriter_make_reader (ft->sorter); + ft->data = casereader_clone (reader); freqs = xnmalloc (casereader_count_cases (reader), sizeof *freqs); for (count = 0; (c = casereader_read (reader)) != NULL; count++) { @@ -649,6 +652,7 @@ cleanup_freq_tab (struct var_freqs *vf) for (i = 0; i < vf->tab.n_valid + vf->tab.n_missing; i++) value_destroy (&vf->tab.valid[i].value, vf->width); } + casereader_destroy (vf->tab.data); free (vf->tab.valid); } @@ -843,83 +847,68 @@ add_percentile (struct frq_proc *frq, double x, bool show, static void dump_freq_table (const struct var_freqs *vf, const struct variable *wv) { - const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; - const struct freq_tab *ft = &vf->tab; - int n_categories; - struct freq *f; - struct tab_table *t; - int r, x; - double cum_total = 0.0; - double cum_freq = 0.0; - - static const char *headings[] = { - N_("Value Label"), - N_("Value"), - N_("Frequency"), - N_("Percent"), - N_("Valid Percent"), - N_("Cum Percent") - }; - - n_categories = ft->n_valid + ft->n_missing; - t = tab_create (6, n_categories + 2); - tab_headers (t, 0, 0, 1, 0); - - for (x = 0; x < 6; x++) - tab_text (t, x, 0, TAB_CENTER | TAT_TITLE, gettext (headings[x])); - - r = 1; - for (f = ft->valid; f < ft->missing; f++) - { - const char *label; - double percent, valid_percent; + struct variable *value_var, *freq_var; + struct pivot_table *pt; - cum_freq += f->count; + pt = xmalloc (sizeof *pt); - percent = f->count / ft->total_cases * 100.0; - valid_percent = f->count / ft->valid_cases * 100.0; - cum_total += valid_percent; + pt->data = casereader_clone (vf->tab.data); - label = var_lookup_value_label (vf->var, &f->value); - if (label != NULL) - tab_text (t, 0, r, TAB_LEFT, label); - - tab_value (t, 1, r, TAB_NONE, &f->value, ft->dict, &vf->print); - tab_double (t, 2, r, TAB_NONE, f->count, wfmt); - tab_double (t, 3, r, TAB_NONE, percent, NULL); - tab_double (t, 4, r, TAB_NONE, valid_percent, NULL); - tab_double (t, 5, r, TAB_NONE, cum_total, NULL); - r++; - } - for (; f < &ft->valid[n_categories]; f++) + pt->dict = dict_create (); + value_var = dict_clone_var_assert (pt->dict, vf->var); + if (wv != NULL) + freq_var = dict_clone_var_assert (pt->dict, wv); + else { - const char *label; - - cum_freq += f->count; - - label = var_lookup_value_label (vf->var, &f->value); - if (label != NULL) - tab_text (t, 0, r, TAB_LEFT, label); - - tab_value (t, 1, r, TAB_NONE, &f->value, ft->dict, &vf->print); - tab_double (t, 2, r, TAB_NONE, f->count, wfmt); - tab_double (t, 3, r, TAB_NONE, - f->count / ft->total_cases * 100.0, NULL); - tab_text (t, 4, r, TAB_NONE, _("Missing")); - r++; + freq_var = dict_create_var (pt->dict, "$Frequency", 0); + var_set_both_formats (freq_var, &F_8_0); + var_set_label (freq_var, _("Frequency")); } - tab_box (t, TAL_1, TAL_1, -1, TAL_1, 0, 0, 5, r); - tab_hline (t, TAL_2, 0, 5, 1); - tab_hline (t, TAL_2, 0, 5, r); - tab_joint_text (t, 0, r, 1, r, TAB_RIGHT | TAT_TITLE, _("Total")); - tab_vline (t, TAL_0, 1, r, r); - tab_double (t, 2, r, TAB_NONE, cum_freq, wfmt); - tab_fixed (t, 3, r, TAB_NONE, 100.0, 5, 1); - tab_fixed (t, 4, r, TAB_NONE, 100.0, 5, 1); - - tab_title (t, "%s", var_to_string (vf->var)); - tab_submit (t); + subcase_init_empty (&pt->split); + subcase_init_empty (&pt->dimensions[TABLE_HORZ]); + subcase_init_empty (&pt->dimensions[TABLE_VERT]); + subcase_add_var (&pt->dimensions[TABLE_VERT], value_var, SC_ASCEND); + + pt->pane.n[TABLE_HORZ] = 4; + pt->pane.n[TABLE_VERT] = 1; + pt->pane.cells = xmalloc (sizeof *pt->pane.cells); + pt->pane.cells[0] = xmalloc (4 * sizeof **pt->pane.cells); + + /* Frequency. */ + pivot_cell_init ( + &pt->pane.cells[0][0], + pivot_value_create (freq_var, PIVOT_SUM, 0, 0, PIVOT_INCLUDE_ALL)); + + /* Percent. */ + pivot_cell_init ( + &pt->pane.cells[0][1], + pivot_value_create (freq_var, PIVOT_SUM, 0, 0, PIVOT_INCLUDE_ALL)); + pt->pane.cells[0][1].cmp = PIVOT_PERCENT; + pt->pane.cells[0][1].cmp_args[0] = pivot_value_create ( + freq_var, PIVOT_SUM, 0, 1, PIVOT_INCLUDE_ALL); + pt->pane.cells[0][1].label = xstrdup ("Percent"); + + /* Valid Percent. */ + pivot_cell_init ( + &pt->pane.cells[0][2], + pivot_value_create (freq_var, PIVOT_SUM, 0, 0, PIVOT_INCLUDE_VALID)); + pt->pane.cells[0][2].cmp = PIVOT_PERCENT; + pt->pane.cells[0][2].cmp_args[0] = pivot_value_create ( + freq_var, PIVOT_SUM, 0, 1, PIVOT_INCLUDE_VALID); + pt->pane.cells[0][2].label = xstrdup ("Valid Percent"); + + /* Cumulative (Valid) Percent. */ + pivot_cell_init ( + &pt->pane.cells[0][3], + pivot_value_create (freq_var, PIVOT_SUM, 0, 0, PIVOT_INCLUDE_VALID)); + pt->pane.cells[0][3].base->n_cum_vars[TABLE_VERT] = 1; + pt->pane.cells[0][3].cmp = PIVOT_PERCENT; + pt->pane.cells[0][3].cmp_args[0] = pivot_value_create ( + freq_var, PIVOT_SUM, 0, 1, PIVOT_INCLUDE_VALID); + pt->pane.cells[0][3].label = xstrdup ("Cum Percent"); + + pivot_table_dump (pt); } /* Statistical display. */