t_kahi’s blog

KNIMEやCellProfiler、創薬に関する記事と,日々のメモです

【KNIME】全てのカラムの数値データをループで処理する

こんばんは,@PKです.

今回は,数値データを含む全てのカラムをループで処理するKNIME Workflowについて紹介します.

はじめに

以前にKNIME Workflowによる実験データの数値処理についてご紹介しました.
www.t-kahi.com

この時は,一つのカラムの数値データを「Rule Engine」と「Math Formula」ノードを使って編集しました.

しかし,ハイコンテントアナリシスのように,何十ものパラメーターの測定結果を取得した場合には,上記のように一つずつ処理をするのはなかなか大変です…

そこで今回は,全てのカラムの数値データをまとめて処理するKNIME Workflowについて紹介します.

この処理はKNIMEのExample Workflowで紹介されており,こちらを参考にさせていただきました.
Looping over all columns and manipulation of each – KNIME Community Workflow Hub

以下,今回のサンプルデータとWorkflow処理の実行結果をお示ししています.
f:id:t_kahi:20190620205345p:plain

ここでは,化合物(A~D)とコントロールの複数の測定データを取得しています.それぞれの測定データをコントロールの値で割り,コントロールに対する相対値を算出したいと思います.

Workflowの概要

KNIME Worlflowの概要です.
f:id:t_kahi:20190620211800p:plain

まず,サンプルデータを読み込んだ後,少し前処理(Compoundカラムを複製)を行います.
その後,ループさせるカラムを「Column Splitter」で選び,ループ処理でそれぞれのカラムごとに計算を行い,計算カラム名と化合物名のカラムを繋げて完成です.
上記の流れについて簡単に紹介していきます.

サンプルデータ取得⇒前処理

以下にサンプルデータ取得から前処理までのWorkflowを示しました.
f:id:t_kahi:20190620220339p:plain

まず,サンプルデータを読み込んだ後に,「Column Filter」で[Compound]列を取り出して,「Column Appender」で追加します.
この操作は,ループで使用する化合物名の列と,最後に「Joiner」で計算結果とつなげるための化合物名の列のそれぞれを取得するために行います.
その後,「Column Splitter」でループをする列(上段)と,化合物名の列(下段)を分けます.

ループ処理について

以下にループ処理のWorkflowと,それぞれの処理によってどのような表が出力されるかを示しています.
f:id:t_kahi:20190620223510p:plain

まず,「Column List Loop Start」でループするカラムを選択します.
Compound#1の列はループさせずに残しておきます.
f:id:t_kahi:20190620223656p:plain この処理を実行すると,ループごとに数値データの列が変更されます.

続いて,「Column Rename (Regex)」ノードでカラム名を変更します.
ここで名前を変えることで,「Rule Engine」や「Math Formula」を使うことができるようになります!
Column Rename (Regex) — NodePit

このノードは正規表現を利用してカラム名を変更します.
正規表現についてはこちら↓
正規表現とは? - Qiita

以下のように,Search String(regex)の部分をFlow Variableを利用して,currentClumnNameにします.
f:id:t_kahi:20190620224112p:plain これによって,どんなカラム名であっても,検索結果が一致するので,カラム名とANONYMOUS_COLUMNに変更することができます.

続いて「Rule Engine」でCompound(#1)がcontrolの場合に数値データをcontrol列に追加します.

$compound (#1)$ = "control" => $ANONYMOUS_COLUMN$

f:id:t_kahi:20190620224905p:plain

この後,「Math Formula」を使用して,controlの数値で全体を割ります.

$ANONYMOUS_COLUMN$/COL_MEAN($control$)

f:id:t_kahi:20190620225132p:plain

計算が終わったので,再び「Column Rename (Regex)」ノードでカラム名を元の名前に変更します.
先ほどと同様にReplacementの部分をFlow Variableを利用して,currentClumnNameにします.
f:id:t_kahi:20190620225258p:plain

最後に数値データの列だけを「Column Filter」で除くことで,以下図のように変換した数値データを得ることができました! f:id:t_kahi:20190620223510p:plain

この後は,ループ処理の結果と,化合物名のカラムを「Joiner」でつなげば完成です.
冒頭でお示ししたように測定データを全て変更することができました.
f:id:t_kahi:20190620205345p:plain

まとめ

今回のポイントは,

- ループを使って目的のカラムをそれぞれ処理する
- 「Column Rename(regex)」とFlow variableをうまく使ってカラム名をループ中は同じ名前にする
- ループの前にカラム名を元に戻す

となります.
このWorkflowはいろいろな実験データ解析に応用できると思うので,ぜひ参考にしていただけると幸いです.