非プログラマーのためのインフォマティクス入門。(仮)

非プログラマーがインフォマティクスについて勉強したことを記録します。主にKNIMEというソフトを使用しています。

非プログラマーのためのインフォマティクス入門。(仮)

【KNIME】ノード紹介:concatenate 〜複数のテーブルをとにかく纏める〜

今回は時間がうまく作れなかったので、短めの記事です。でも活用頻度は大のノードを紹介します。

 

Concatenate

 名前の通り、連結するノードです。極力余計なことはしないで、複数のデータを"縦方向に"連結します。キャプチャを見た方が早いと思うので、貼ります↓。

f:id:sumtat:20170809033425p:plain

 入力側の2つのテーブルには"name", "maker", "price"の共通するカラムがあります(属性も一致)。カラム名が同じものは、同じところに並べてくれます。一方で"status", "amount"はそれぞれ片方にしかありません。このようなカラムもとにかく連結してくれます。データのない部分は欠損値になります。

 設定画面で、両者に共通のカラムだけ残すという指定もできますが、何も考えず繋げてGoでいいかな?と思いますよ!

 さて、結果"name"の 【A】に注目します。Aはどちらの入力側テーブルにも入っているデータです。結果側ではAは2回、それぞれ別のrowとして格納されます。これが冒頭で述べた、「極力余計なことをしないで」という雰囲気でしたが伝わったでしょうか?

 

 【concatenateをした後にGroupByする】のと、【JoinerでFull outer joinする】のはほぼ同じですね。

 

注意点としては

カラム名は同じ、属性が違う】

みたいなデータをconcatenateするときは少し気をつけましょう。例を載せます↓

f:id:sumtat:20170809040317p:plain

 わざと、下側の入力テーブルの"price"をstringに変えました。Number to stringノードの詳細は今回は省きますが、設定画面でintegerやdoubleにしたいstring属性のカラムを選ぶだけです。この状態でconcatenateすると結果の"price"の属性は?になっています。この状態を避けるためにも、入力データのカラム属性には気をつけましょう。

 

<補足>

上記の?ですが、こんな感じで直せます↓

f:id:sumtat:20170809041205p:plain

String Manipulationを使って、

toInt($price$)と記述し、priceカラムをreplace(置き換え)すれば、結果はintegerになりますよ。string manipulationは万能選手です。

 

 concatenateノードには2つのテーブルしか連結できませんが、concatenate (optional in)というノードを使うと4つまで連結可能です(1番最初のキャプチャをみてね)。

 Row splitterなどでデータを2つのフローに分けた後に、それぞれに対し必要な処理を行い、最後にconcatenateするというような使い方もします。

 

 世の中、絶対ということはなかなか無いと思いますが、KNIMEを使う限りかなり高い確率で使用するノードです。知っておいて損はないですよ。