code: @SuppressWarnings({ "unchecked", "rawtypes" })
      public Table apply() {
          List<Table> results = new ArrayList<>();
          ArrayListMultimap<String, AggregateFunction<?, ?>> reductionMultimap = getAggregateFunctionMultimap();
  
          for (String name : reductionMultimap.keys()) {
              List<AggregateFunction<?, ?>> reductions = reductionMultimap.get(name);
              Table table = TableSliceGroup.summaryTableName(temp);
              for (AggregateFunction function : reductions) {
                  Column column = temp.column(name);
                  Object result = function.summarize(column);
                  ColumnType type = function.returnType();
                  Column newColumn = type.create(TableSliceGroup.aggregateColumnName(name, function.functionName()));
                  if (result instanceof Number) {
                      Number number = (Number) result;
                      newColumn.append(number.doubleValue());
                  } else {
                      newColumn.append(result);
                  }
                  table.addColumns(newColumn);
              }
              results.add(table);
          }
          return (combineTables(results));
      }
docs: Returns the result of applying to the functions to all the values in the appropriate column
  TODO add a test that uses a non numeric return type with apply