};
static const struct fmt_spec dest_format[n_RANK_FUNCS] = {
- {FMT_F, 9, 3}, /* rank */
- {FMT_F, 6, 4}, /* normal */
- {FMT_F, 6, 2}, /* percent */
- {FMT_F, 6, 4}, /* rfraction */
- {FMT_F, 6, 4}, /* proportion */
- {FMT_F, 6, 0}, /* n */
- {FMT_F, 3, 0}, /* ntiles */
- {FMT_F, 8, 4} /* savage */
+ [RANK] = { .type = FMT_F, .w = 9, .d = 3 },
+ [NORMAL] = { .type = FMT_F, .w = 6, .d = 4 },
+ [PERCENT] = { .type = FMT_F, .w = 6, .d = 2 },
+ [RFRACTION] = { .type = FMT_F, .w = 6, .d = 4 },
+ [PROPORTION] = { .type = FMT_F, .w = 6, .d = 4 },
+ [N] = { .type = FMT_F, .w = 6, .d = 0 },
+ [NTILES] = { .type = FMT_F, .w = 3, .d = 0 },
+ [SAVAGE] = { .type = FMT_F, .w = 8, .d = 4 }
};
static const char * const function_name[n_RANK_FUNCS] = {
if (!lex_force_match (lexer, T_LPAREN))
return false;
- if (! lex_force_int (lexer))
+ if (! lex_force_int_range (lexer, "NTILES", 1, INT_MAX))
return false;
cmd->k_ntiles = lex_integer (lexer);
size_t i;
out_case = case_create (casewriter_get_proto (output));
- case_data_rw_idx (out_case, 0)->f = case_num_idx (c, 1);
+ *case_num_rw_idx (out_case, 0) = case_num_idx (c, 1);
for (i = 0; i < cmd->n_rs; ++i)
{
rank_function_t func = rank_func[cmd->rs[i].rfunc];
double rank = func (cmd, tw, cc, cc_1, tie_group, w);
- case_data_rw_idx (out_case, i + 1)->f = rank;
+ *case_num_rw_idx (out_case, i + 1) = rank;
}
casewriter_write (output, out_case);
rank.ties = TIES_MEAN;
rank.fraction = FRAC_BLOM;
rank.print = true;
+ rank.vars = NULL;
rank.pool = pool_create ();
string_set_init (&new_names);
{
struct pivot_table *table = pivot_table_create (
N_("Variables Created by RANK"));
- table->omit_empty = true;
pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("New Variable"),
N_("New Variable"), N_("Function"),
iv->current = casereader_read (iv->input);
}
-static int
+static enum trns_result
rank_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED)
{
struct rank_trns *trns = trns_;
size_t i;
for (i = 0; i < trns->n_funcs; i++)
- case_data_rw (*c, iv->output_vars[i])->f
+ *case_num_rw (*c, iv->output_vars[i])
= case_num_idx (iv->current, i + 1);
advance_ranking (iv);
break;
return true;
}
+static const struct trns_class rank_trns_class = {
+ .name = "RANK",
+ .execute = rank_trns_proc,
+ .destroy = rank_trns_free,
+};
+
static bool
rank_cmd (struct dataset *ds, const struct rank *cmd)
{
subcase_add_vars_always (&projection,
cmd->group_vars, cmd->n_group_vars);
subcase_add_vars_always (&projection, dict_get_split_vars (d),
- dict_get_split_cnt (d));
+ dict_get_n_splits (d));
if (weight_var != NULL)
{
subcase_add_var_always (&projection, weight_var, SC_ASCEND);
- weight_idx = 2 + cmd->n_group_vars + dict_get_split_cnt (d);
+ weight_idx = 2 + cmd->n_group_vars + dict_get_n_splits (d);
}
else
weight_idx = -1;
/* Group by split variables */
subcase_init_empty (&split_vars);
- for (j = 0; j < dict_get_split_cnt (d); j++)
+ for (j = 0; j < dict_get_n_splits (d); j++)
subcase_add_always (&split_vars, 2 + j + cmd->n_group_vars,
var_get_width (dict_get_split_vars (d)[j]),
SC_ASCEND);
}
free (outputs);
- add_transformation (ds, rank_trns_proc, rank_trns_free, trns);
+ add_transformation (ds, &rank_trns_class, trns);
/* Delete our sort key, which we don't need anymore. */
dict_delete_var (d, order_var);