混合数据类型Matlab表

时间:2015-12-09 11:41:09

标签: matlab data-cleansing matlab-table

我希望在以下数据上使用makeValidName函数:

Id  Val Random          Desc
a   1.1 0.036835624 Bread Cheese
b   2.2 0.020442492 Fish Bread
c   -3.3    0.020050676 Cheese Fish
d   #N/A    0.017619332 Bread Cheese
e   -5.4    0.014973153 Fish Bread
f   6.6 0.014648887 Cheese Fish
g   -7.6    0.014071844 Bread Cheese
h   8   0.014013118 Fish Bread

但是当我导入表格时(使用readtable从xlsx读取),它看起来像这样:

inputData =

 Id             Val              Random          Desc     
____    ____________________    ________    ______________

'a '    '1.1'                   0.036836    'Bread Cheese'
'b'     '2.2'                   0.020442    'Fish Bread'  
'c'     '-3.3'                  0.020051    'Cheese Fish' 
'd'     'ActiveX VT_ERROR: '    0.017619    'Bread Cheese'
'e'     '-5.4'                  0.014973    'Fish Bread'  
'f'     '6.6'                   0.014649    'Cheese Fish' 
'g'     '-7.6'                  0.014072    'Bread Cheese'
'h'     '8'                     0.014013    'Fish Bread'  

如何阻止它将Val中的条目从数字转换为字符串?这使得无法使用makeValidName。我需要在所有行和列中应用makeValidName,因为表非常大,并且单独命名相应的列是不可行的。那么最优雅的方法是什么呢?

当前代码:

varnames = inputData.Properties.VariableNames;
for ii = 1:length(varnames)

inputData.(varnames{ii})= matlab.lang.makeValidName(inputData.(varnames{ii}));

end

产生错误:

  

使用matlab.lang.makeValidName时出错(第72行)首先必须输入   字符串或矢量单元格数组。

并在Val

等列中产生不良结果

inputData =

Id            Val             Random         Desc     
___    __________________    ________    _____________

'a'    'x1_1'                0.036836    'BreadCheese'
'b'    'x2_2'                0.020442    'FishBread'  
'c'    'x_3_3'               0.020051    'CheeseFish' 
'd'    'ActiveXVT_ERROR_'    0.017619    'BreadCheese'
'e'    'x_5_4'               0.014973    'FishBread'  
'f'    'x6_6'                0.014649    'CheeseFish' 
'g'    'x_7_6'               0.014072    'BreadCheese'
'h'    'x8'                  0.014013    'FishBread'

1 个答案:

答案 0 :(得分:1)

因为在中间使用Excel似乎更令人头痛。我建议使用basic模式,这将减轻一些解析错误。

来自the documentation

  

basic模式是没有Excel for Windows的系统的默认模式。在   basic模式,readtable

     
      
  • 仅读取XLS,XLSX,XLSM,XLTX和XLTM文件。
  •   
  • 在读取XLS文件时不支持'Range'名称 - 值对参数。
  •   
  • 将所有日期导入为Excel序列日期编号。 Excel序列日期编号使用与MATLAB®日期编号不同的参考日期。
  •   

这允许我们使用TreatAsEmpty名称 - 值对参数,因为它将正确解析数字列。

inputData = readtable('test.xlsx', 'Basic', 1, 'TreatAsEmpty', '#N/A');

返回示例案例:

inputData = 

    Id     Val      Random          Desc     
    ___    ____    ________    ______________

    'a'     1.1    0.036836    'Bread Cheese'
    'b'     2.2    0.020442    'Fish Bread'  
    'c'    -3.3    0.020051    'Cheese Fish' 
    'd'     NaN    0.017619    'Bread Cheese'
    'e'    -5.4    0.014973    'Fish Bread'  
    'f'     6.6    0.014649    'Cheese Fish' 
    'g'    -7.6    0.014072    'Bread Cheese'
    'h'       8    0.014013    'Fish Bread'

理论上,这应该意味着数字数据列是double数组,并且字符串保留在cell数组中。因此,要使用matlab.lang.makeValidName,您可以使用iscell测试每个列,看看它是否是一个单元格数组:

varnames = inputData.Properties.VariableNames;
for ii = 1:length(varnames)
    if iscell(inputData.(varnames{ii}))
        % If they're strings they're in a cell array
        inputData.(varnames{ii})= matlab.lang.makeValidName(inputData.(varnames{ii}));
    end
end

返回:

inputData = 

    Id     Val      Random         Desc     
    ___    ____    ________    _____________

    'a'     1.1    0.036836    'BreadCheese'
    'b'     2.2    0.020442    'FishBread'  
    'c'    -3.3    0.020051    'CheeseFish' 
    'd'     NaN    0.017619    'BreadCheese'
    'e'    -5.4    0.014973    'FishBread'  
    'f'     6.6    0.014649    'CheeseFish' 
    'g'    -7.6    0.014072    'BreadCheese'
    'h'       8    0.014013    'FishBread'