/*Google AdSense自動広告*/

2019年8月9日金曜日

Alteryx : R Toolでテーブルを横展開する(reshape wide)~Cross Tabツールを不便に思ったら~

コードフリーのAlteryxで結局コードを書くシリーズ【第2弾】

縦に並んだテーブルを、ある項目をキーとして横方向に展開するには、Cross Tabツールを使います。

しかし、このツールには制限があり、展開する列は1つのみで、列名を自動付与することができません。そのため、2つ以上の列を横展開するには、Cross Tabを複数個用意してからSelectツールで列名を変更してから結合するという、バカらしくも面倒なフローが必要となります。そこで、それらの処理をR Tool一発でできるようなコードを書きました。

困ったときはR Tool、R言語を覚えつつ、最終的にAlteryxはイラナイ!となるのが、コスト・スキル的にベストだと思います。

処理の概要とワークフロー

例として、店舗名と商品ID、Key Performance Indicatorがいくつかまとまった表をソースとして、グラフの描画に使うため、日付ごとに全て横並びにしたい場合。



 ↓




下図ワークフローの、Cross Tabを使う流れの場合、ShopとItemIdを文字列結合してキーとし、Group byにDateId、ヘッダーにShopItemId、値にKPI_1を指定します。値に指定できるのはひとつだけなので、KPI_2はもう一つのCross Tabで処理し、Joinしなければなりません。









しかも、Cross Tab後のデータはKPI_1かKPI_2か項目名では分からなくなるので、それぞれ項目名をリネームする必要があります。私が担当を任された表では、これが10以上あったので、超絶面倒になって、R言語を勉強した方がマシ!と思った次第です。

そもそもAlteryxのグラフツールが、項目を抽出して項目名を付けてくれるとか、横軸のインターバル(間引きして見やすく)とかが柔軟にできていたら、この横展開も必要なかったのに…。結局Excelのグラフを使い、参照するテーブルを更新する形にしました。





R Toolの処理解説

R Toolの中身は↓

--------------------------------------------------------------------------------------

df <- read.Alteryx("#1", mode="data.frame")
sidf <- subset(df, select=c(Shop, ItemId))
ShopItemId <- apply(sidf, 1, paste, collapse = "_")
df <- cbind(df, ShopItemId)
df <- df[ , colnames(df)!="Shop"]
df <- df[ , colnames(df)!="ItemId"]
df <- reshape(df, timevar="ShopItemId", idvar="DateId", direction="wide")
write.Alteryx(df, 1)

--------------------------------------------------------------------------------------

上から説明します。

--------------------------------------------------------------------------------------


df <- read.Alteryx("#1", mode="data.frame")

Alteryxのワークフローからテーブルをデータフレームとして読み込みます。勿論、Text Inputの他、Input DataもDynamic Inputも使えます。




sidf <- subset(df, select=c(Shop, ItemId))
ShopItemId <- apply(sidf, 1, paste, collapse = "_")
df <- cbind(df, ShopItemId)

項目Shop, ItemIdのみのテーブルを作り、applyで行毎に文字列を結合、キー値として最初のテーブルに追加します。




df <- df[ , colnames(df)!="Shop"]
df <- df[ , colnames(df)!="ItemId"]

項目Shop, ItemIdが残っていると、横展開で出てきてしまうので、列削除します。一行で複数列を削除することもできるようですが、暗号みたいな文字列に蕁麻疹が出る人なので…。




df <- reshape(df, timevar="ShopItemId", idvar="DateId", direction="wide")

reshape関数で変換したデータフレームを、元のデータフレームに代入します。別のデータフレームにして、途中経過を出力してもいいでしょう。timevarは横に展開するキーとなる項目、idvarはグルーピングする項目で、その他の項目は全て名前が自動付与されて(例→KPI_1.Sendai-2、間の「.」ドットは変更できないようです)、横に並びます。directionは横展開がwide、縦展開はlongを指定します。




write.Alteryx(df, 1)

データフレームdfを、R Toolの出力足1番に出力します。R Toolには5つ足が付いていますので、処理途中を2番など、デバッグにも使えます。基本的に1入力1出力で使うのが分かりやすいと思います。



0 件のコメント:

コメントを投稿