0

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'。

何?どの未定義関数? 「イク」とは?

良い。テーブルについていくつか読んだ後、おそらくより高いレベルのmatlabが「==」をオーバーライドしないことがわかりました。それが平等を意味する「eq」です。しかし、エラーメッセージは確かに有益ではありません.

それから私の2回目の試み。

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


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

今回は、

テーブルへの割り当ての右側は、別のテーブルまたはセル配列でなければなりません。

良い。わかった。テーブルが欲しい。私はそれを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 から cell への変換はできません。

この matlab テーブルは、R のデータ フレームや python pandas の DataFrame に似ていると思いました。確かにそうではありません。誰かがこの問題を解決する方法を教えてくれますか?

4

2 に答える 2

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テーブルのオーバーロードが異なる別のものがあります。

2 回目の試行は

>> 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'
于 2016-06-10T11:16:14.427 に答える
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);
于 2016-06-10T11:47:24.310 に答える