Unite dataset via fn

    Parameters
    ----------
    dataset : list
        A list of data
    basecolumn : int
        A number of column which will be respected in uniting dataset
    fn : function
        A function which recieve :attr:`data` and return classification string.
        It if is None, a function which return the first item of the
        :attr:`data` will be used (See ``with_filename`` parameter of
        :func:`maidenhair.load` function).

    Returns
    -------
    list
        A united dataset

def unite_dataset(dataset, basecolumn, fn=None):
    """
    Unite dataset via fn

    Parameters
    ----------
    dataset : list
        A list of data
    basecolumn : int
        A number of column which will be respected in uniting dataset
    fn : function
        A function which recieve :attr:`data` and return classification string.
        It if is None, a function which return the first item of the
        :attr:`data` will be used (See ``with_filename`` parameter of
        :func:`maidenhair.load` function).

    Returns
    -------
    list
        A united dataset
    """
    # create default unite_fn
    if fn is None:
        fn = default_unite_function
    # classify dataset via unite_fn
    united_dataset = OrderedDict()
    for data in dataset:
        unite_name = fn(data)
        if unite_name not in united_dataset:
            united_dataset[unite_name] = []
        united_dataset[unite_name].append(data[1:])
    # unite dataset via maidenhair.loaders.base.unite_dataset
    for name, dataset in united_dataset.items():
        united_dataset[name] = _unite_dataset(dataset, basecolumn)[0]
    # create new dataset (respect the order of the dataset)
    dataset = []
    for name, _dataset in united_dataset.items():
        dataset.append([name] + _dataset)
    return dataset