表計算で不要な行を削除するときに、2つまでの条件であればExcelのフィルター機能で楽にできます。しかし、3つ以上の条件になったときにはExcelでは簡単にできなくなります。MATLABプログラミングで3つ以上のフィルター条件で不要な行の削除を簡単に行う方法を説明します。
Excelで楽にフィルターできるのは条件2つまで?
仕事でExcelを使っている人は、フィルター機能を頻繁につかうことでしょう。
Excelでのフィルターは、「ホーム」から、「並べ替えとフィルター」アイコンをクリックし、フィルター設定で、2つまでの条件を「および(AND)」もしくは「または(OR)」演算で入れることができます。
では、フィルター条件が3つ以上あるときはどうしたらよいでしょうか?
例えば、以下のように多数のEmailが入った表 ”ListA”があるとします。
このリストから、”@pmail.com”、”@smail.com”、”@tmail.com”を含む行だけを削除したいと考えています。
これをExcelでやろうとするとどのようにすればよいでしょうか?
最初に ”@pmail.com”、”@smail.com”を含む行を削除して、そのあとで”@tmail.com”を含む行を削除して、と2段階に分けて行う方法があります。
しかし、除外条件の数が増えてきたときには、この作業はかなり面倒です。できれば一発で指定した条件の行は削除したいところです。
また、Microsoft公式サポートにも以下のような記事が掲載されていますが、「高度なフィルター」や「詳細設定」がうまく機能しませんでした。(もしかするとやり方を間違った可能性もありますが)
そこで、この作業をMATLABで簡単にできるか調べてみることにしました。
ChatGPTを使ってプログラミング
前回の記事同様にMATLABでプログラムが簡単に書けるか試したいのですが、今回のタスクは少々複雑です。そこで生成AI 「ChatGPT」を使ってサンプルプログラムを書いてもらえないか試してみます。
ChatGPTで以下のようなプロンプトを入力してみます。
以下のように非常に短い行で回答が返ってきました。最初の3行は、サンプルの表を定義しているだけなので、実質的には6行目の”exclude_conditions = …” 以下の4行です。(%でコメントアウトされた行を除く)
さて、この比較的短い行で本当に機能するのでしょうか?実際のListAを読み込むようにプログラムを書き換えてMATLABで実行してみます。
結果は以下のようになりました。左が元のListA、右がプログラム実行後 不要な行が削除されたリストです。期待通りの動作をしてくれているようです。
プログラム実行前 | プログラム実行後 |
ただ、このまま使うだけでは 実際何をしているかわかりませんし、本当に正しく動いているのか確認できません。このままでは気持ち悪いので、次の章で一行ずつ解説していきます。
MATLABのコマンド解説
numel関数は、表の行数をカウントする目的で使われていますが、本来は表のすべてのセルの数をて数えてしまいます。この場合は 1列n行の表なので、(行の数)=(セルの数)となり問題ありませんが、mxn列の表の場合は =(行の数)となりません。行の数を数えるのであれば、height関数 を使うほうが適切でしょう。
参考)列の数を数えるには width 関数 を使います。
その他にこのプログラムで使われているのは、MATLABのcontains 関数です。サポートページには以下のように書かれています。
TF = contains( は、str に指定されたパターンが含まれる場合に 1 (true ) を返し、それ以外の場合に 0 (false ) を返します。 |
これだけだと、何をしているのかわかりにくいのですが、少ないコマンド行で複雑な操作ができる裏には、MATLAB特有の行列をまとめて操作できる機能が関係しています。
プログラムの10行目のコマンドがこのタスクの主要部分です。
ListA = ListA(~contains(ListA.Email, exclusion_conditions{i}), :);
|
表の中の一部の固まりをまとめて操作できるMATLAB特有の機能については次の記事で詳しく解説します。
MATLABの得意な行列の操作 文字列編|脱Excel プログラミング