def crosstab_by_assignation rows, columns, values
        raise 'Three vectors should be equal size' if
          rows.size != columns.size || rows.size!=values.size

        data = Hash.new { |h, col|
          h[col] = rows.factors.map { |r| [r, nil] }.to_h
        }
        columns.zip(rows, values).each { |c, r, v| data[c][r] = v }

        # FIXME: in fact, WITHOUT this line you'll obtain more "right"
        # data: with vectors having "rows" as an index...
        data = data.map { |c, r| [c, r.values] }.to_h
        data[:_id] = rows.factors

        DataFrame.new(data)
      end
Generates a new dataset, using three vectors
- Rows
- Columns
- Values

For example, you have these values

x   y   v
a   a   0
a   b   1
b   a   1
b   b   0

You obtain
id  a   b
a  0   1
b  1   0

Useful to process outputs from databases