【KNIME】ノード紹介:Group Loop Start 〜カテゴリごとに処理したい〜
先日、KNIMEでloopを回すにはどうするか?という記事を書きました。割と興味を持っていただけたのか、たくさんブックマークもして頂きました。ありがとうございます。
こんなニッチな内容でも読んでくださる方がいるというのは嬉しいですし、今後も頑張って書いてみよう!とモチベーションも上がりました。
私も分からないことの方が多いです。もし、もっとお詳しい方がいらっしゃれば、是非コメントなどいただけると嬉しいです。
さてさて、上のリンク記事の例題は、複数のファイルを一気に読むというものでしたが、今回はその逆で
【データの内容を複数のファイルに書き出す】
という作業について紹介してみようと思います。
例では、もう少しひねくれて"1つのエクセルファイルに複数のシートとして分割させる"という内容にしてみました。
キャプチャに掲げたように、以前の例で紹介したfile_0 ~ file_9をひとまとめにして出来上がったテーブルを、シート名を元のファイル名とした1つのエクセルファイルに書き出してみます。
全体像のキャプチャを載せます↓
基本的には赤枠の部分(青枠を除く)で目的は達成できますが、もう少しおまけ要素を盛り込みました。緑枠部分は過去記事を参照いただければと思います。
それでは順に紹介していきます。
MolConverter
おまけ要素からの説明で申し訳ないのですが、順番なのでご容赦ください。
ChemAxon / Infocomのノードで、化合物の記述方法を色々変換できるノードです。marvin sketchもそうですが、chemaxon製品?っていいなーと個人的に思います。 InfocomはKNIMEの講習会とかもやっているみたいです。私は出たことないです。どんな感じなんでしょうか?
話が逸れました。設定画面を開きます。
The structure columnで変換対象のカラムを指定後、The output formatでどの形式にしたいかをプルダウンから選べばOKです。今回はUnique SMILESにしました。今回はSMILESを使って何かするわけじゃないので、なんでもいいんですが、私はこれをよく使います。
実行後のキャプチャを載せます↓
細かいですが、実行前の構造はカラムにSDFと書かれていますが、実行後はSMIになっています。またカラム名を右クリックして、stringを選択してみましょう。
ちゃんとSMILESになっているのが確認できるはずです。
他にもRDKitやIndigo2のノードにSMILESを吐くノードがあるので、お好みで使い分けてください。
Group Loop Start
指定したカテゴリごとに処理を行いたい時に、始点となるノードです。設定画面を開きます。
どのカテゴリごとに処理したいの?という設定です。所望のカラムを緑枠内に指定してください。今回はsource(もとのファイル名が入っているカラム)を指定することで、同じファイル名のデータごとにグループになって、次のノードへと受け渡されていきます。
*仮に、CHMEBLIDも緑枠内に指定すると、【CHEMBLIDとsourceの内容がともに同じ】ものがまとまって処理されることになります。
それでは実行してみます。
まずは1周目のデータが流れてきます。出力結果のFlow Variablesのタブを確認してください。特に** to variableみたいなノードを挟んでいませんが、"source"が変数となっているのがわかります。
ですので、この変数をファイル名(今回はsheet名)に使えばOKなのですが、ちょっと細工をしてみます。ここからはおまけ要素です。
シートの名前を
元のファイル名(データの数)
という形式にしてみます。
各グループごとのデータ数を取得する
以前に紹介したValue Counterを活用してみます。先のgroup loop startで指定したカラム(今回はsource)についてvalue counterの処理をしてやれば、データの数がわかるはずです。
まず1周目で流れてきたfile_0に関するデータは434個であることがわかります。
この内容をTable Row to Variableを使って変数とします。
出来上がった変数をString Manipulation (Variable)に流します。
この作業で新たにcount, RowIDという名前の変数ができました。これ以前に、既に出来上がっていた変数(例えばsource)も無くならずに流れてきます。
String Manipulation (Variable)
String Manipulation の対変数仕様です。本流のデータではなく、変数の値に加工をしたい場合に活用できます。
ちなみにこのノードの入り口は●ではなく○になっています。
この○の意味するところは
「変数の赤線をつなげてくれれば受け取るし、つなげなくてもいいよー」
という感じです。繋げた場合はワン・ツーでパンチを繰り出すし、繋げない場合はノーモーションでパンチ打てるよ(新規に変数が作れる)みたいなイメージです。
今回はtable row to variableの内容を受け取って、それを活用します。
join($${SRowID}$$,"(",string($${Icount}$$),"comp.)")
と書きました。
元のファイル名(データ数comp.)
という形式に合わせたjoinです。ちなみにデータ数はintegerなのでstringを使って文字列に変えています(comp.はcompound:化合物の略。単位と思ってください。)。
このように括弧内に別のfunctionを入れても問題無いです。ネストって言うんですかね?あんまりやりすぎると分かりにくくなります。
実行結果を見てみます。
指定した変数名で、思い通りの値を持っていることが確認できます。
Excel Sheet Appender
指定したエクセルファイル内に、新しいシートとしてデータを書き出すノードです。
Excel Writerと場面により使い分けるといいと思います。
ファイル名はresult.xlsxとしました。シート名をvariableボタン利用して、先ほど作成したsheet_nameという変数に指定します。
最後にループの終点を書き足します。
Variable Loop End
流れてきた変数を受け取って貯める。本来はこんな感じの利用をするノードですが、今回のようなケースでも活用できます。どういうことかと言うと…
よしよし、ループの終わりだからloop endだな!と最初は考えると思うのですが…。
writer(excel sheet appender)の出口▶︎が無いよー!困った、繋げない!
となってしまうわけです。
で、そこはwriterさえ動けばいいので、流れてきた変数を受けとって貯めるvariable loop endをつなげておけば目的が達成できます。
ちなみにvariable loop endからは、↓のようなデータが吐かれます。
まさに変数が貯められた感じですね。
一方で、所望のエクセルファイルはちゃんと出来上がっています。
今回の内容で、変数を書き出しファイル名にすれば複数のファイルが出来上がります。
いかがでしたか?
今回の【元のファイル名:source】というのを
- 担当者氏名
- 使用年、使用月
- 勘定科目
などと皆様の環境に当てはまりそうな項目として読み替えていただくと、親が湧くかもしれません。
それではまた次回!