withMissingValuesDropped method

DataFrame withMissingValuesDropped([
  1. Iterable<String>? columns
])

A new data frame comprising the rows without any missing values.

Example:

final d = """
    a,b
    1,apple
    2,ball
 <NA>,cat
    4,<NA>
    5,egg
""".parseAsCsv();
print(d);
print(d.withMissingValuesDropped());

.---.-------.
|a  |b      |
:---+-------:
|1  |apple  |
|2  |ball   |
|NaN|cat    |
|4  |<NA>   |
|5  |egg    |
'---'-------'

.-.-------.
|a|b      |
:-+-------:
|1|apple  |
|2|ball   |
|5|egg    |
'-'-------'

Implementation

DataFrame withMissingValuesDropped([Iterable<String>? columns]) {
  columns =
      columns ?? [...this.numericColumns.keys, ...this.categoricColumns.keys];

  if (columns.any((key) =>
      !this.numericColumns.containsKey(key) &&
      !this.categoricColumns.containsKey(key))) {
    throw PackhorseError.badArgument(
        "Bad column names $columns" "(DataFrame.withMissingValuesDropped).");
  }

  final numericColumns = <String, NumericColumn>{},
      categoricColumns = <String, CategoricColumn>{},
      indicesWithMissingValues = _rowIndicesWithMissingValues(columns),
      indicesWithoutMissingValues = [
        for (var i = 0; i < rowNumber; i++)
          if (!indicesWithMissingValues.contains(i)) i
      ];

  for (final MapEntry(:key, :value) in this.numericColumns.entries) {
    numericColumns[key] =
        NumericColumn(value.valuesAtIndices(indicesWithoutMissingValues));
  }

  for (final MapEntry(:key, :value) in this.categoricColumns.entries) {
    categoricColumns[key] =
        CategoricColumn(value.valuesAtIndices(indicesWithoutMissingValues));
  }

  return DataFrame(
    numericColumns: numericColumns,
    categoricColumns: categoricColumns,
  );
}