首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Matlab表中删除@NA

从Matlab表中删除@NA
EN

Stack Overflow用户
提问于 2015-12-08 09:41:12
回答 1查看 293关注 0票数 0

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

代码语言:javascript
复制
    errorTerms={'@NA', '#NA', 'ActiveX VT_ERROR: '};
inputData=readtable(inputFile,'TreatAsEmpty',errorTerms);

然而,“@NA”这个词仍然存在。

我可以这样除掉他们:

代码语言:javascript
复制
inputData.GICS1=strrep(inputData.GICS1,'@NA','NaN');

但这需要几个独立的循环,因为我有许多不同大小的表。是否有更优雅的方法将这些数据作为表导入?还是洗干净?

数据如下:

Id Avg GICS1 a 3.0 @NA b 5.6消费标准c 4.8材料d 3.1保健e 1.6能源f 9.3 @NA g 8.5工业h 7.0消费者酌处权

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-08 15:11:38

您可以使用varfun遍历表列,并使用regexreperrorTerms数组对每个列应用正则表达式:

代码语言:javascript
复制
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是导致问题的原因,但我很懒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34152501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档