Измените строковые значения на числа в таблице Matlab
Я использую 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
Я получаю следующую ошибку:
Неопределенная функция 'eq' для входных аргументов типа 'cell'.
Какие? Какая неопределенная функция? Что такое "эквалайзер"?
Что ж. Прочитав немного о таблице, я понял, что якобы более высокий уровень 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);
Что ж. На этот раз сообщение об ошибке.
Преобразование в ячейку из двойного невозможно.
Я думал, что эта таблица Matlab похожа на R-фрейм данных или Python DataFrame. Ну, конечно, это не так. Может кто-нибудь подсказать мне, как решить эту проблему?
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);
Мой 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
с нулевым индексом это дает пустую таблицу. Если ни одна из этих проблем не является проблемой, то сохранение скалярного двойника в таблице является несоответствием типов.
Я не получил ваше сообщение об ошибке 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'