在 Matlab 中将字符串值更改为数字 table
Change string values to number in Matlab table
我正在使用 Matlab2015b。我想将一个简单的 csv 文件读入 table 并将其字符串值更改为相应的数值。
我有以下示例数据。
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
我收到以下错误:
未定义函数 'eq' 用于 'cell' 类型的输入参数。
什么?哪个未定义函数?什么是 'eq'?
嗯。在阅读了一些关于 table 的内容后,我了解到更高级别的 matlab 不会覆盖“==”。即 'eq' 表示相等。但是错误消息肯定不是信息。
然后我第二次尝试。
T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});
rows_attack = strcmp(T.VarClass,'attack');
T(rows_attack,2) = 1
这一次,我得到了
赋值到table的右侧必须是另一个table或一个单元格
数组.
嗯。好的。它想要 table。我给一个。
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);
嗯。这次报错信息是.
无法从双精度转换为单元格。
我认为这个 matlab table 类似于 R data-frame 或 python pandas DataFrame。好吧,当然不是。有人可以指导我如何解决这个问题吗?
我的 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
错误是多方面的。在 table 上应用 strcmp
不会给出向量;相反,它是一个标量 0
。当使用零索引索引 T
时,它给出一个空的 table。如果这些都不是问题,那么将双精度标量存储到 table 中就是类型不匹配。
我在任何试用中都没有收到您的错误消息 Undefined function 'eq' for input arguments of type 'cell'.
。也许您的 matlab 环境或版本具有不同的 strcmp
,它对 table 具有不同的重载。
你的第二次尝试是
>> 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'
嗯。感谢@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);
我正在使用 Matlab2015b。我想将一个简单的 csv 文件读入 table 并将其字符串值更改为相应的数值。
我有以下示例数据。
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
我收到以下错误:
未定义函数 'eq' 用于 'cell' 类型的输入参数。
什么?哪个未定义函数?什么是 'eq'?
嗯。在阅读了一些关于 table 的内容后,我了解到更高级别的 matlab 不会覆盖“==”。即 'eq' 表示相等。但是错误消息肯定不是信息。
然后我第二次尝试。
T = readtable('example_data.csv', 'Delimiter',',','FileType','text','TreatAsEmpty',{'?'});
rows_attack = strcmp(T.VarClass,'attack');
T(rows_attack,2) = 1
这一次,我得到了
赋值到table的右侧必须是另一个table或一个单元格 数组.
嗯。好的。它想要 table。我给一个。
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);
嗯。这次报错信息是.
无法从双精度转换为单元格。
我认为这个 matlab table 类似于 R data-frame 或 python pandas DataFrame。好吧,当然不是。有人可以指导我如何解决这个问题吗?
我的 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
错误是多方面的。在 table 上应用 strcmp
不会给出向量;相反,它是一个标量 0
。当使用零索引索引 T
时,它给出一个空的 table。如果这些都不是问题,那么将双精度标量存储到 table 中就是类型不匹配。
我在任何试用中都没有收到您的错误消息 Undefined function 'eq' for input arguments of type 'cell'.
。也许您的 matlab 环境或版本具有不同的 strcmp
,它对 table 具有不同的重载。
你的第二次尝试是
>> 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'
嗯。感谢@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);