2016-06-10 5 views
0

Я использую Matlab2015b. И я хотел бы прочитать простой файл csv в таблице и изменить его строковые значения на соответствующие числовые значения.Изменение строковых значений на число в таблице Matlab

Имею следующие данные примера.

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

Я хотел бы изменить эти значения строк на число. например attack = 1, normal = -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 

Я получаю следующее сообщение об ошибке:

Неопределенная функция 'эк' для входных аргументов типа 'клетка'.

Что? Какая неопределенная функция? Что такое «экв»?

Ну. После прочтения некоторых о таблице я понял, что предположительно более высокий уровень matlab не переопределяет '=='. Это «экв», что означает равенство. Однако сообщение об ошибке не является информативным.

Тогда моя вторая попытка.

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 pandas DataFrame. Ну, конечно, это не так. Может ли кто-нибудь помочь мне решить эту проблему?

+0

Эта ошибка была рассмотрена в закрытом блоге * Abandon Matlab * очень красиво. Mathworks каким-то образом любит молчащие исключения, пока он не разрастается где-то дальше по линии. – percusse

+0

хорошо. Matlab использует {} символы при индексировании ячеек и [] для матриц (т. Е. Удваивает). Поэтому T {rows_attack, 2} = -1 должен это сделать. – GameOfThrows

+0

Не работает. T {rows_attack, 2} = 1; Преобразование в ячейку с двойным невозможно. –

ответ

0

Ну. Благодаря @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); 
1

My 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' 
+0

Я хочу изменить колонку VarClass, но я полагаю, это непросто. –

+0

Спасибо, с помощью вас, я решил свою проблему. –