混合数据类型Matlab表



我希望对以下数据使用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'

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

来自文件:

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'  

相关内容

  • 没有找到相关文章

最新更新