return *f;
}
+enum
+ {
+ MEANS_MEAN = 0,
+ MEANS_N,
+ MEANS_STDDEV
+ };
+
/* Table of cell_specs */
static const struct cell_spec cell_spec[] = {
{N_("Mean"), "MEAN", NULL, NULL, arithmean_get},
/* Missing value class for dependent variables */
enum mv_class dep_exclude;
+ bool listwise_exclude;
+
/* an array indicating which statistics are to be calculated */
int *cells;
means.exclude = MV_ANY;
means.dep_exclude = MV_ANY;
+ means.listwise_exclude = false;
means.table = NULL;
means.n_tables = 0;
be dropped FOR THAT TABLE ONLY.
*/
{
- means.exclude = MV_ANY;
- means.dep_exclude = MV_ANY;
+ means.listwise_exclude = true;
}
else if (lex_match_id (lexer, "DEPENDENT"))
/*
while (lex_token (lexer) != T_ENDCMD
&& lex_token (lexer) != T_SLASH)
{
- int k;
- for (k = 0; k < n_C; ++k)
+ int k = 0;
+ if (lex_match (lexer, T_ALL))
{
- if (lex_match_id (lexer, cell_spec[k].keyword))
- {
- means.cells =
- xrealloc (means.cells,
- ++means.n_cells * sizeof (*means.cells));
+ int x;
+ means.cells =
+ xrealloc (means.cells,
+ (means.n_cells += n_C) * sizeof (*means.cells));
- means.cells[means.n_cells - 1] = k;
- break;
+ for (x = 0; x < n_C; ++x)
+ means.cells[means.n_cells - (n_C - 1 - x) - 1] = x;
+ }
+ else if (lex_match_id (lexer, "NONE"))
+ {
+ /* Do nothing */
+ }
+ else if (lex_match_id (lexer, "DEFAULT"))
+ {
+ means.cells =
+ xrealloc (means.cells,
+ (means.n_cells += 3) * sizeof (*means.cells));
+
+ means.cells[means.n_cells - 2 - 1] = MEANS_MEAN;
+ means.cells[means.n_cells - 1 - 1] = MEANS_N;
+ means.cells[means.n_cells - 0 - 1] = MEANS_STDDEV;
+ }
+ else
+ {
+ for (; k < n_C; ++k)
+ {
+ if (lex_match_id (lexer, cell_spec[k].keyword))
+ {
+ means.cells =
+ xrealloc (means.cells,
+ ++means.n_cells * sizeof (*means.cells));
+
+ means.cells[means.n_cells - 1] = k;
+ break;
+ }
}
}
if (k >= n_C)
for (i = 0; i < table->n_interactions; ++i)
{
- if ( is_missing (means, table->dep_vars[v], table->interactions[i], c))
+ if ( is_missing (means, table->dep_vars[v],
+ table->interactions[i], c))
goto end;
}
{
for (t = 0; t < cmd->n_tables; ++t)
{
+ bool something_missing = false;
int v;
struct mtable *table = &cmd->table[t];
is_missing (cmd, table->dep_vars[v],
table->interactions[i], c);
if (missing)
- table->summary[v * table->n_interactions + i].missing++;
+ {
+ something_missing = true;
+ table->summary[v * table->n_interactions + i].missing++;
+ }
else
table->summary[v * table->n_interactions + i].non_missing++;
}
}
+ if ( something_missing && cmd->listwise_exclude)
+ continue;
+
categoricals_update (table->cats, c);
}
}