AlteryxでFormulaツールの対象列を動的に変えたい

こんにちは、小澤です。

Alteryxでは通常、ほとんどのツールで処理対象となる列はドロップダウンやチェックボックスで選びます。 そのため、Analytic AppやMacroなどで処理対象の列を実行時に渡された設定値によって変えたい場合は、 Drop DownツールやList Boxツールなどのインターフェースツールをそのまま活用できます。

しかし、これではとっても困る場面があります。 それはFormula式の中で使っている列を変更したい場合です。 インターフェースから与えられた値をそのまま使うのであれば「[#1]」のようにコネクション名を使えばいいのですが、列名を置き換えるとなるとそうもいきません。

今回は、そんなときにどうすればいいかを解説したいと思います。

Formulaツールの式の書き換えと文字列として渡す方法

さて、通常のFormulaツールでは式の中で列名を指定して値を取得するには「[列名]」のように指定します。 これは変数のような扱いなので、文字列として"[列名]"のような値を与えてもそのままの値が出力されます。 そのため、インターフェースツールを使って入力しても値の置換は行われません。

Text Boxツールを使って式全体を入力 → ActionツールでFormulaツールのexpressionの値を置き換える、ということも可能ですが、複雑なものだと式全体を毎回記述するのは煩雑ですし入力ミスも多くなってしまいます。

エラーになって終了であればまだいいのですが、これが文法上は正しいけど本来やりたい計算ではなかった場合などはミスにも気付き辛く、致命的な問題となる可能性もあります。

式全体の一部を文字列として渡して、他の部分は固定とできればいいのですがFormulaツールでこれを実現するのは難しそうです。 そこで登場するのがDynamic Replaceツールです。

Dynamic Replaceツールがどのようなものかは以前以下で解説しました。

Dynamic Renameツールを使うと、Formula式を文字列として与えるととが可能になります。 例として、以下のようなデータがあるといます。

Field1 Field2 Target
1 4 Field1
2 5 Field2
3 6 Field1

このデータに対して、文字列で以下のようなFormula式をしてすることが可能です。

"ToString([" + [Target] + "])個の桜餅があります。"

この結果をResult列に入れたとすると、結果は以下のようになります。

Field1 Field2 Target Result
1 4 Field1 1個の桜餅があります。
2 5 Field2 5個の桜餅があります。
3 6 Field1 3個の桜餅があります。

Target列に入っている値に応じて、Formula中で利用する列の値が変わっているのがわかるかと思います。

実際に使ってみる

では、Dynamic Renameを使って実際に対象の列を変更可能なワークフローの例を見てみましょう。

全体像は以下のようになっています。

非常にシンプルなワークフローですね。 このワークフローでやりたいことは、"Text Inputで入力された数値列の値を2倍にする"というものです。

上部では、入力データをそのままDynamic Replaceツールに渡しています。 Dynamic Repalceツールの設定は下側の値が重要になってくるのでその時に解説します。 なお、データは以下のようになっています。

途中まで、それっぽい項目を考えようと思ってたのですが、途中から適当なものを列の値に入れ始めています。

下側の部分では、まずText Inputツールを使っていますが、これはFormulaツールは入力が必須となるため適当な値を渡しているだけとなります。

続いて、Formulaツールでは3つの計算を行っています。

(状況をわかりやすくするために3つ計算してるのでText Inputにdummy入れないでboolの列先に作っとけばよくね?という突っ込みがご勘弁ください)

target列は、計算結果の値の出力先となる列名を入れています。 今回は、元のデータをそのまま書き換えるので、計算対象として指定された列をそのまま入れてますが、別な列の値を書き換えたり新しい列を作る場合は、固定値を入れたり別なText Inputで入力してもらうでも問題ありません。

2つ目のbool列は固定で1を入れています。 これは、0以外の値であれば何でも問題ありません。 使い方についてはこの後のDynamic Renameツールで解説します。

3つ目のexpressionはいよいよ登場した、文字列としてFormula式を生成する部分になります。 今回は、"Text Inputで与えられた列の値を2倍にする"という計算を行うので、それを行う文字列を生成してます。

Text Inputツールに「トイレに行った回数」列を与えて実行したときのFormulaツールの結果は以下のようになります。

これでtarget列の値をexpression列に記載されたFormula式の計算結果で置き換える準備は整いました。

さて、いよいよDynamic Renameツールの登場です。

Dynamic Renameツールには2つの入力があります。 上側の「O」は対象となるデータ、下側の「R」には文字列で記述されたFormula式があるデータを渡します。

設定値の上3つは下側のデータの列名で以下のように選択します。

  • Field Name Field : 出力対象となる列名
  • Boolean Expression Field : ここで指定した式がTrueとなる行のみを計算する
  • Output Value Field : 出力対象となる値

今回は、先ほどFormulaツールが出力したそれぞれの列を指定しています。 2つ目の設定値の値を1としているため、ここではすべての行がこの条件を満たすようになっています。 そのため、全データが対象となります。

ここで、もう一つ大事な設定があります。 「Value are Expressions/Formulas」にチェックを入れるようにしてください。 これによって、expression列に記述されているのが単純な値ではなく、Formula式であると認識するようになります。

このツールの出力は2つあります。 上側の「O」出力は実際に処理を行った後の結果です。 今回の場合は、以下のようになっており、「トイレに行った回数」列が2倍になっているのが確認できるかと思います。

下側の「S」出力は、どの変換処理が何件行われたかが出力されます。

今回は、[トイレに行った回数] * 2の処理を行った件数が5件、nullを出力したのが0件となっています。 個の出力結果は「R」側の入力が複数行あるような場合はそれぞれに対して適用された件数が表示されます。 また、すべてのBoolean Expression Fieldを満たすことがなかったレコードの場合、nullを出力するため、その出力を行った行数も表示されるというわけです。

対象の列を複数選びたい場合は?

さて、先ほどはText Boxに1つだけ対象の列を自由記述してもらう形式でした。 これに対して、複数列を選べるようにすることも可能です。

ワークフローが若干複雑になっていますが、先ほどのワークフローと比較して追加されているのは以下の部分となります。

まずは、Text Boxだったものが、List Boxになっています。 これを入力データから接続しているため、データ中の列一覧から選択が可能になっています。

"2倍にする"という計算は数値でしかできないため、List Boxの型を以下のように制限しています。

これによって、実行時には以下のようなList Boxからの入力が求められます。

さて、先ほどは1つの値のみの入力でしたが、List Boxの場合どのように値を受け取るのでしょうか? 答えは以下のようになっています。

id=False,売上=True,日給=True,ランチで使った金額=False,トイレに行った回数=True

全ての項目が、<項目名>=<チェックの有無>の形式で、カンマ区切りで渡されます。 これを分割しているのが以降の処理になります。

Text to Columnsツールを2つ使って、「,」区切りで縦持ちに分割 → 「=」区切りで2カラムに分割として、以下のようなデータを得ます。

あとは、Filterツールでtarget2列がTrueになっている項目のみを抜き出せば必要な形式でのデータ取得が完了します。

対象の列の指定は、target1列に既に存在しているので、expression列とbool列を以下のように作成することでDynamic Repalceの入力が完成します。

入力ファイルも変更できるようにするには?

さて、ここまでくればあとはFile Browseツールを使って入力ファイルも自由に選べるようにすれば汎用性は高まりそうです。

しかし、ここで注意が必要な点があります。 「入力ファイルの変更」と「入力データの列一覧取得」はAnalytic Appでは同時に行うことができません。

これは、メタデータの更新タイミングに依存するためです。 メタデータそのものに関しては、以下をご参照ください。

Macroなんかだと、ツールに入力されるものが変わった段階で、メタデータも更新されるため、設定項目の列一覧が自動的に変わってくれるのですが、Analytic Appでは、実行時の設定項目変更のタイミングでこのメタデータの更新が行われません。

これ自体は、通常のワークフローでも同じで、ワークフローの内容が変わった時には更新されるが設定値を変えるタイミングでは更新されない、という動きとなっているためです。

そのため、Analytic Appでこれらを併用することはできない仕様となっています。 両方同時にできるようにするには、Macro化してしまうのがいいでしょう。

おわりに

今回は、Dynamic RepalaceツールとAnalytic AppやMacroの組み合わせで計算対象の列を動的に変更する方法を紹介しました。

これを書いてて、こんな感じのメタプログラミングAlteryx的シリーズ(名前はメタプログラミングRubyから)があっても面白いかもな、と思ったりもしました。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400