UnWeeklyAlteryxTips#102 行生成ツールで複数の値を扱う方法

Alteryx

Alteryx Designerの行生成ツールはプログラミング言語でいうところのForループを実現するものですが、常に単一の値を扱うことしかできません。もちろん他の列の値を見ながら行生成は可能ですが、行生成の際に複数の変化する値を扱うことはできません。

なのですが、ひと工夫すると複数の変化する値を扱うことが可能です。ちょっと複雑な使い方になりますが、今回はこの方法をご紹介します。

復習:行生成ツール

少し復習しましょう。行生成ツールは、あるフィールドに対して、スタートの値、ループ時に変化させる数式、ループさせる条件、の3つを指定する形になります。

例えば、数値を1から10まで作りたいときは、以下のような設定になります。

  • 項目名:RowCount
  • 初期化式(スタートの値):1
  • ループ式(ループ時に変化させる数式):RowCount + 1
  • 条件式(ループ条件):RowCount <= 10

これを各行に対してそれぞれ行うこともできますし、新規で1から実行することも可能です。

行生成ツールで複数の値を扱う方法

行生成ツールは、テキスト型の項目に対して実行することが可能です。つまり、テキスト型の項目内でデータの持ち方を工夫することで、複数の値を扱う、ということになります。例えば、空白区切りのテキストを持っておいて、これをテキスト処理で処理を行う、ということになります。

AlteryxではGetWord、GetPartなどの関数で、テキストから部分的な切り出しが簡単にできます。GetWordは空白区切り専用ですが、空白区切りされたテキストから場所を指定するだけで値の抽出が可能です(場所は、文字数ではなく、空白区切りの何個目か、という指定です)。GetPartは区切り記号自体を指定できます。

例えば、フィールド名が「text」で「word1 word2 word3」と空白区切りになっている場合、GetWord([text],1)とすると「word2」が抽出できます(指定は0始まりなので、1と指定すると2番目の値が抽出されます)。

個人的には今回のような処理を行う場合、計算式が複雑になるので、なるべく文字数が少なくなる「GetWord」を好んで使っています。

例:素因数分解をする

素因数分解を行う場合、ある数を割った数、割ったあとの数が常に変化し、それぞれ保持しておく必要があるため、一般的にAlteryxで行うには反復マクロで実装することになります。

例えば以下のような反復マクロになります(詳細は割愛しますが、割った数を繰り返し割れなくなるまで割っていき、割れなくなったら割る数を+1するようなマクロです)。

マクロ:

比較的シンプルですね・・・。

これを行生成ツールで表現すると以下のようになります。

(最初の行生成ツールは、値を作るためのものなので、それを除いて)行生成ツールが2つあれば素因数分解ができます。ただし、素数以外のものが混ざってくるので、素数判定マクロで取り除いています。

これを一つの行生成ツールでやってみましょう。

一つの行生成ツールで複数の値を扱う

行生成ツールが生成する行は以下のようなフォーマットとします。

変数1 変数2 変数3(半角空白区切り)

  • 1つ目の変数:割った数
  • 2つ目の変数:割る数(素因数候補)
  • 3つ目の変数:割り切れたかどうか(割れたらT、割れなかったらF)

それぞれの変数を取り出すときは、GetWord関数を使います。1つ目の変数は0、2つ目の変数は1、3つ目の変数は2でGetWord関数の2つ目の変数で指定します。つまり、GetWord([t],0)のような感じで指定します。取得した値は文字列なので、必要に応じてToNumber関数などで数値として扱います。

初期化式として、元の数を2で割れたら「元の数割る2、2、T」とします。割れなかったら「元の数、2、T」とします。

条件式は、割る数が元の数割る2+1より小さい、としています(素因数分解の場合は、SQRT(N)回割り算をすればよいのですが、割ったあとの数を約数としないやり方で行っているので計算回数が少し増えています)。

ループ式は複雑ですが、たとえば、割った数を取り出すときはToNumber(GetWord([t],0))としているので冗長になってしまっています。1つ目の変数を2つ目の変数で割り切れたら新しく作成する行に対して1つ目の変数を2つ目の変数で割った値を格納し、2つ目の変数はそのまま格納します。最後に「T」をつけて割り切れたことをマークします。割り切れなかった場合は、1つ目の変数はそのまま格納し、2つ目の変数は+1して格納します。

これによって、以下のような結果が得られます。

tの一番最後の文字列が「T」であるものが素因数です。

実際にやってることは、まず2で割る、割り切れれば割り切れなくなるまで割る。割り切れなければ+1した数で割っていく、を繰り返しているだけです。

正直、行生成ツールに複数の値をもたせるのは非常に計算式が複雑なのであまりやりたくないのですが、パフォーマンス的に反復マクロだと時間がかかりすぎるようなケースでは非常に有効な手法です。

といっても、私も普段の業務でやったことはない気がします。Advent of CodeやProject Eulerなどの実装力を鍛える場くらいでしか使ったことはないのですが、実務で使えた人がいたらぜひ教えてほしいです。

まとめ

  • 行生成ツールにて、1つのテキストフィールドを生成し、複数の値を詰め込むことで、行生成ツールの限界を超える方法をご紹介しました
  • 複数の値が同時に変化するようなケースで非常に効果的に動作します。つまり、反復マクロを使わずに反復マクロのユースケースに対応できる場合があります
  • Alteryxで素因数分解するワークフローとしても今回のサンプルは利用できるので「もし」必要な場合はご活用ください。
  • 2025.1では行生成ツールでサイズが自動的に初期化されるバグがあるのでご注意ください
  • もっと簡単な例でご紹介したかったのですが、思いつきませんでした・・・。

サンプルワークフローダウンロード

次回

またまた行生成ツールのトピックスをご紹介します。

コメント

タイトルとURLをコピーしました