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を使用して各列に正規表現を適用するために使用できます。regexreperrorTerms

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 に答える