3つ以上の条件で不要な行を削除する
ListA = ListA(~contains(ListA.Email, exclusion_conditions{i}), :); |
テーブル(Table)配列 | 表形式のデータを、列のラベルを保持して保管します。 |
セル(Cell)配列 | 表の要素(データ)を順序を保持して保管します。 |
論理型(Logical)配列 | 真偽値 (true または false) を格納するために使用されます。 |
セル配列として取り込むとき A = readcell (‘food.xslx’); |
テーブル配列として取り込むとき
B = readtable (‘food.xslx’); |
Food_T = cell2table(Food, “VariableNames”, [“Fruit”, “Vegetable”] ); |
Food_C = table2cell(Food_T); |
列”Fruit”の値をセル配列として取り出す
Fruit_C = Food_T.Fruit; |
列”Fruit”の値をテーブル配列として取り出す
Fruit_T = Food_T(:, 1); |
たとえば以下のような”くだもの”というテーブル配列があるとします。この中のデータには、”くだもの”でないデータ”ゴリラ”や”パンダ”が混じっています。これらを除外して、”くだもの”だけのテーブルを作成したいとします。なんらかのコマンドで各データが”くだもの”か”くだものでないか”を判定し、1か0かの論理型配列をつくります。この論理型配列をもとのテーブル配列にかけあわせると、”くだもの”だけのテーブル配列が簡単に作成できるのです。
MATLABで文字列が入った表を取り扱うときに欠かせないのが contains関数です。
contains関数は、セル配列の中のすべてのデータについて、指定した文字列が含まれているか、いないかを 0と1の論理値の表で表した論理値配列で返します。
例えば、以下のようなEmailアドレスが入ったテーブル”ListA”があったとき、”@pmail.com”という文字列が入った行を判別したいとします。その場合、
L = contains(ListA.Email, ‘@pmail.com’);
とすれば、’@pmail.com’という文字列が入った位置には’1′ (Yes)が、それ以外には’0′ (No)の値が入った論理値配列が結果で返ってきます。判別ができるのは、テーブル配列ではなくセル配列であることに注意してください。
コマンドの解説
ListA = ListA(~contains(ListA.Email, exclusion_conditions{i}), :); |
部分ごとに分けて何をしているかみてみましょう。
ListA.Email | テーブル配列”ListA”から、列”Email”に含まれる値をセル配列で取り出しています |
exclusion_conditions{i} | i = 1のときは、除外したいEmailアドレスのうち、最初の要素 ’@pmail.com’を示しています |
contains(ListA.Email, exclusion_conditions{i}) | i = 1のとき、’@pmail.com’が入った行には ‘1’, そうでない行には ‘0’の論理値が入った論理値配列を返します |
~contains(ListA.Email, exclusion_conditions{i}) | ‘~’マークは、論理値を否定する記号です。論理値が’1’だったら’0’に、’0’だったら’1’を返します。
したがって’@pmail.com’が入った行には ‘0’, ‘@pmail.com’が入っていない行には ‘1’の論理値が入った論理値配列を返します |
ListA(~contains(ListA.Email, exclusion_conditions{i}),:) | ListAのうち、’@pmail.com’が入った行を取り除き、’@pmail.com’が入っていない行のみを残したテーブルを作成します |
このプログラムでは、For文で 除外するEmailドメインの数だけこの作業を繰り返しています。
したがって、
除外する条件(この場合はEmailドメイン)は、セル配列 ‘exclusion_conditions’の中に、足していけばいくらでも増やせます。