【问题标题】:Change string values to number in Matlab table在 Matlab 表中将字符串值更改为数字
【发布时间】:2016-06-10 19:47:24
【问题描述】:

我正在使用 Matlab2015b。我想将一个简单的 csv 文件读取到一个表中,并将其字符串值更改为相应的数值。

我有以下示例数据。

Var1, VarClass
1 , attack
2 , normal
1, attack

我想将此字符串值更改为数字。例如攻击 = 1,正常 = -1。

我的第一次尝试。

T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});

rows_attack = strcmp(T(:,2),'attack');
T(rows_attack,2) = 1

rows_normal = strcmp(T(:,2),'normal');
T(rows_normal,2) = -1

我收到以下错误:

'cell' 类型的输入参数的未定义函数 'eq'。

什么?哪个未定义函数?什么是'eq'?

嗯。在阅读了一些关于表格的内容后,我了解到所谓的更高级别的 matlab 不会覆盖'=='。那是'eq',意思是平等。但是错误消息肯定没有信息。

然后我的第二次尝试。

T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});


rows_attack = strcmp(T.VarClass,'attack');
T(rows_attack,2) = 1

这一次,我明白了

分配到表格的右侧必须是另一个表格或单元格 数组。

嗯。好的。它想要桌子。我给它一个。

T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});

rows_attack = strcmp(T.VarClass,'attack');
rows_attack_size = sum(rows_attack);
data_to_fill = ones(rows_attack_size,1) ;
T(rows_attack,2) = array2table(data_to_fill);

嗯。这次的错误信息是。

无法从 double 转换为单元格。

我认为这个 matlab 表类似于 R data-frame 或 python pandas DataFrame。好吧,当然不是。有人可以指导我如何解决这个问题吗?

【问题讨论】:

  • 这个错误问题在现已关闭的 Abandon Matlab 博客中得到了很好的解决。 Mathworks 不知何故喜欢静默异常,直到它在更远的地方爆炸。
  • 好吧。 Matlab 在索引单元格时使用 { } 符号,对矩阵(即双精度数)使用 [ ]。所以 T{rows_attack,2} = -1 应该这样做。
  • 它不起作用。 T{rows_attack,2} = 1;无法从 double 转换为单元格。
  • 它需要一个单元格,所以 T.VarClass(rows_attack) = {1} 应该可以工作
  • @Ondiz Conversion to cell from double is not possible.

标签: matlab matlab-table


【解决方案1】:

我的 Matlab 为您的代码提供了不同的错误信息。

>> rows_attack = strcmp(T(:,2),'attack')  

rows_attack =

     0

>> T(rows_attack,2) = 1
Right hand side of an assignment into a table must be another table or a cell array.
 >> T(rows_attack,2)

ans = 

   empty 0-by-1 table

错误是多方面的。在桌子上应用strcmp 不会给出向量;相反,它是一个标量0。当使用零索引索引T 时,它会给出一个空表。如果这些都不是问题,那么将标量 double 存储到表中就是类型不匹配。

我没有从我的任何试用版中收到您的错误消息Undefined function 'eq' for input arguments of type 'cell'.。也许您的 matlab 环境或版本有不同的strcmp,它对表有不同的重载。

你的第二次尝试是

>> rows_attack = strcmp(T.VarClass,'attack') 

rows_attack =

     1
     0
     1

>> T(rows_attack,2) = 1
Right hand side of an assignment into a table must be another table or a cell array.

>> T(rows_attack,2)    

ans = 

    VarClass
    ________

    'attack'
    'attack'

所以这次错误很简单。无论如何,看起来希望将第一行更改为1,因为这些是数字。但是,我得到了错误

>> T(rows_attack,1) =2
Right hand side of an assignment into a table must be another table or a cell array.

如果在处理正确的列时尊重上述故障,您的最后一次尝试会奏效。

>> rows_attack = strcmp(T.VarClass,'attack');
>> rows_attack_size = sum(rows_attack);
>> data_to_fill = ones(rows_attack_size,1) ;
>> T(rows_attack,2) = array2table(data_to_fill);
Conversion to cell from double is not possible.

>> data_to_fill

data_to_fill =

     1
     1

>> whos ans
  Name      Size            Bytes  Class    Attributes

  ans       2x1              1502  table              

>> T(rows_attack,1) = array2table(data_to_fill);
>> T

T = 

    Var1    VarClass
    ____    ________

    1       'attack'
    2       'normal'
    1       'attack'

>> 

另外,以下也有效

>> rows_attack = strcmp(T.VarClass,'attack'); T.Var1(rows_attack) = -1

T = 

    Var1    VarClass
    ____    ________

    -1      'attack'
     2      'normal'
    -1      'attack'

【讨论】:

  • 我想更改 VarClass 列,但我想这并不容易。
【解决方案2】:

嗯。感谢@Yvon,我发现了我的错误并解决了我的问题。以下代码有效。

T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});


 rows_attack = strcmp(T.VarClass,'attack');
 T.VarClass(rows_attack) = {-1};

 rows_normal = strcmp(T.VarClass,'normal');
 T.VarClass(rows_normal) = {1};

 T.VarClass = cell2mat(T.VarClass);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多