Microsoft Power Query Mの学習記録です。主にM言語です。
この投稿の方針
- 糖衣構文である
each ...
は可能な限り使いません。元の表現(_) => ...
を使います。
Windows 10でPower Query Mを試す
Windows 10ではMicrosoft StoreからPower BI Desktopが無償でダウンロードできます。Power Query Mはこのソフトウェアで試せます。
- Power BI Desktopの起動後、アプリケーション上側のリボン→「データを取得」の下矢頭→「空のクエリ」でPower Query Mがクエリエディタが起動します。
- 単一行の場合は数式に記入します。複数行の場合は上側のリボンから「詳細エディタ」をクリックします。
公式ドキュメント
List.Generate
関数の概要
List.Generate
は他の言語のfor
文に該当する関数です。
List.Generate(
initial as function,
condition as function,
next as function,
optional selector as nullable function) as list
as function
が繰り返されるので複雑に感じますが、要は次のfor
文です。
c++
std::vector<std::any> v;
for (const auto& _ = initial(); condition(_); next(_))
{
v.push_back(selector != nullptr ? selector(_) : _);
}
整数のリストを作成する
リストの特別な整数シークエンス表現とList.Generate
関数が利用できます。
1ずつ増加する整数の範囲
{0..100}
each ...
は(_) => ...
の糖衣構文です。https://docs.microsoft.com/en-us/powerquery-m/understanding-power-query-m-functionsのEach Keywordをご覧ください。
1ずつ増加する整数の範囲
List.Generate(() => 0, (_) => _ <= 100, (_) => _ + 1)
5ずつ増加する整数の範囲
List.Generate(() => 0, (_) => _ <= 100, (_) => _ + 5)
1ずつ減少する整数の範囲
List.Generate(() => 100, (_) => _ >= 0, (_) => _ - 1)
5ずつ減少する整数の範囲
List.Generate(() => 100, (_) => _ >= 0, (_) => _ - 5)
リストを変形する
List.Transform
関数を使います。
全要素に2を乗じる
List.Transform({0..100}, (_) => _ * 2)
型のリストを得る
List.Transform({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_){0})
整数から"偶数"と"奇数"のリストを得る
List.Transform({0..10}, (_) => {"偶数","奇数"}{Number.Mod(_, 2)})
リストを選択する
偶数のみ選択
List.Select({0..100}, (_) => Number.Mod(_, 2) = 0)
奇数のみ選択
List.Select({0..100}, (_) => Number.Mod(_, 2) = 1)
テキスト型のみ選択
List.Select({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_) = type text)
数値型のみ選択
List.Select({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_) = type number)
リスト、レコード、テーブルの変形と選択
型 | 変形 | 選択 |
---|---|---|
List | Transform | Select |
Record | TransformFields | SelectFields |
Table | TransformColumns TransformRows |
SelectColumns SelectRows SelectRowsWithErrors |
リストを列としたテーブルを作成する
let
List1 = {0..10}
in
Table.FromColumns(
{
List1,
List.Transform(List1, (_) => {"偶数", "奇数"}{Number.Mod(_, 2)})
},
{"リスト", "偶奇"}
)