gusucode.com > bigdata 工具箱 matlab源码程序 > bigdata/+matlab/+bigdata/+internal/+util/calculateLocalSummary.m

    function summaryInfo = calculateLocalSummary( localTable )
% Calculate summary information for a local piece of a partitioned table.
% Output is a cell array containing one info struct per table variable.

%   Copyright 2016 The MathWorks, Inc.

vars = localTable.Properties.VariableNames;
summaryInfo = cell(1, numel(vars));
for idx = 1:numel(vars)
    var = localTable.(idx);
    if iscellstr(var)
        clz = 'cell string';
    else
        clz = class(var);
    end
    info = struct('Name', vars{idx}, ...
        'Size', size(var), ...
        'Class', clz);
    if ismatrix(var)
        if isnumeric(var) || isduration(var)
            info = iAddDatatypeInfo(info, var, NaN, @isnan);
        elseif islogical(var)
            info = iAddLogicalInfo(info, var);
        elseif isa(var, 'categorical')
            info = iAddCategoricalInfo(info, var);
        elseif isa(var, 'datetime')
            info = iAddDatatypeInfo(info, var, NaT, @isnat);
        end
    end
    summaryInfo{idx} = info;
end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Add info for numeric/datatime/duration types.
function info = iAddDatatypeInfo(info, var, missingVal, isMissingFcn) %#ok<INUSL> eval!

var = var(:);
numMissing = sum(isMissingFcn(var));
% Here we rely on the fact that omitnan/omitnat is the default.
minVal = min(var);
maxVal = max(var);

info.NumMissing = numMissing;
info.MinVal     = minVal;
info.MaxVal     = maxVal;
info.MissingStr = strtrim(evalc('disp(missingVal)'));
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function info = iAddLogicalInfo(info, var)
info.true = sum(var(:));
info.false = numel(var) - info.true;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function info = iAddCategoricalInfo(info, var)
var = var(:);
numundef = sum(isundefined(var));
cats     = categories(var);
counts   = countcats(var);
% NB countcats may not necessarily return a column vector, so we force both
% to be columns so that we don't attempt to add a row to a column later on
% in the iAddCategoricalInfos call. See g1357299.
cats = cats(:);
counts = counts(:);
if numundef > 0
    cats{end+1,1} = categorical.undefLabel;
    counts(end+1,1) = numundef;
end
info.CategoricalInfo = { cats, counts };
if isordinal(var)
    info.Class = 'ordinal categorical';
end
end