0

我有以下代码来清理错误术语的表数据:

    errorTerms={'@NA', '#NA', 'ActiveX VT_ERROR: '};
inputData=readtable(inputFile,'TreatAsEmpty',errorTerms);

但是“@NA”条款仍然存在。

我可以通过这种方式摆脱它们:

inputData.GICS1=strrep(inputData.GICS1,'@NA','NaN');

但这需要几个独立的循环,因为我有许多不同大小的表。有没有更优雅的方式将这些数据导入为表格?还是清洗一下?

数据如下所示:

Id Avg GICS1
a 3.0 @NA
b 5.6 Consumer Staples
c 4.8 Materials
d 3.1 Health Care
e 1.6 Energy
f 9.3 @NA
g 8.5 Industrials
h 7.0 Consumer Discretionary
4

1 回答 1

1

您可以使用varfun您的表格列并使用regexrep您的errorTerms数组将正则表达式应用于每列:

inputData = readtable('test.xlsx');

errorTerms = {'@NA', '#NA', 'ActiveX VT_ERROR: '};
expression = sprintf('(%s)', strjoin(errorTerms, '|'));

% Explicit loop
varnames = inputData.Properties.VariableNames;
for ii = 1:length(varnames)
    try
        inputData.(varnames{ii}) = regexprep(inputData.(varnames{ii}), expression, 'NaN');
    catch err
        switch err.identifier
            case 'MATLAB:UndefinedFunction'
                % Do nothing, skip loop iteration
            otherwise
                rethrow(err)
        end
    end
end

% % Only works for string data
% varnames = inputData.Properties.VariableNames;
% inputData = varfun(@(x) regexprep(x, expression, 'NaN'), inputData);
% inputData.Properties.VariableNames = varnames; % Variable names overwritten by varfun, set them back

编辑:我添加了一个try/catch块来说明您列中的混合数据类型。我要提醒的是,这是一个相当贪婪的实现,一个更强大的方法是比较错误消息以确保regexprep是什么导致了问题,但我很懒。

于 2015-12-08T15:11:38.827 回答