从 Matlab Table 中删除“@NA”
Remove '@NA' from Matlab Table
我有以下代码来清理 table 错误术语数据:
errorTerms={'@NA', '#NA', 'ActiveX VT_ERROR: '};
inputData=readtable(inputFile,'TreatAsEmpty',errorTerms);
但是“@NA”条款仍然存在。
我可以通过这种方式摆脱它们:
inputData.GICS1=strrep(inputData.GICS1,'@NA','NaN');
但这需要几个独立的循环,因为我有许多不同大小的 table。
是否有更优雅的方式将此数据导入为 tables?还是清理一下?
数据如下所示:
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
您可以使用 varfun
to go through your table columns and apply a regex to each column using 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
是导致问题的原因,但我很懒惰。
我有以下代码来清理 table 错误术语数据:
errorTerms={'@NA', '#NA', 'ActiveX VT_ERROR: '};
inputData=readtable(inputFile,'TreatAsEmpty',errorTerms);
但是“@NA”条款仍然存在。
我可以通过这种方式摆脱它们:
inputData.GICS1=strrep(inputData.GICS1,'@NA','NaN');
但这需要几个独立的循环,因为我有许多不同大小的 table。 是否有更优雅的方式将此数据导入为 tables?还是清理一下?
数据如下所示:
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
您可以使用 varfun
to go through your table columns and apply a regex to each column using 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
是导致问题的原因,但我很懒惰。