#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"
struct freq_tab
{
struct casewriter *sorter;
+ struct casereader *data;
struct freq *valid; /* Valid freqs. */
int n_valid; /* Number of valid freqs. */
/* 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++)
{
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);
}
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);
}
\f
/* Statistical display. */