В Power Query как заменить значения в нескольких столбцах значениями в другой таблице?

#powerbi #powerquery #m

#powerbi #запрос мощности #m

Вопрос:

Я работаю с опросом американского сообщества в Power BI и хочу заменить значения в каждом столбце соответствующими значениями в другой таблице меток ответов. Например, раса кодируется как 1,2,3,4,5, но я хочу заменить ее на азиатскую, черную, родную и т.д. В соответствии с предоставленными метками ответов.

Допустим, у меня есть следующая таблица с тремя переменными и ответами людей:

Переменная 1 переменная 2 переменная 3
1 2 3
2 3 2
3 1 1
3 3 2
2 2 3

Мне предоставлена эта таблица ключей ответа:

ВарНаме Клавиша ответа Метка ответа
Переменная 1 1 Синий
Переменная 1 2 красный
Переменная 1 3 Зеленый
переменная 2 1 осталось
переменная 2 2 правильно
переменная 2 3 вниз
переменная 3 1 высокий
переменная 3 2 Средний
переменная 3 3 низкий

То, что я хочу, — это те три переменные с ответами людей в качестве ‘ResponseLabel’, например:

Переменная 1 переменная 2 переменная 3
Синий правильно низкий
красный вниз Средний
Зеленый осталось высокий
Зеленый вниз Средний
красный правильно низкий

Обычно я бы шел один за другим и заменял каждую переменную вручную, но я предпочел бы иметь корневой канал, чем делать это для сотен с лишним переменных с где-то от 2-100 ответов, поэтому я полагаю, что есть лучший способ сделать это.

До сих пор я думал о создании таблиц для каждой переменной и слиянии с исходной таблицей, но это тоже звучит слишком много. Затем я подумал, что, может быть, мне следует написать функцию для итерации по исходной таблице и перекодирования каждого столбца один за другим. Я также думаю, что, возможно, есть способ сделать это в M, но я не уверен.

У вас есть какие-нибудь идеи? Спасибо!

Комментарии:

1. Не было бы проще сделать объединение вместо замены?

2. Вы имеете в виду объединение, как при объединении таблиц в PQ, или объединение, как при создании связи между таблицами? спасибо за редактирование: чтобы уточнить, существует более ста столбцов, и в каждом столбце может быть сто вариантов ответа с различиями.

3. Я думаю, вы могли бы просто объединить эти более ста столбцов в один и выполнить соединение только один раз.

4. Это и есть тот самый путь. Открепите обе таблицы, объедините с помощью левого внешнего соединения, разверните, готово.

5. Я попробовал объединить, но не думаю, что я правильно откорректировал свои таблицы. исходная таблица Здесь — метки , здесь — слияние двух , а вот расширенные результаты , которые неупорядочены, и я не уверен, как вернуть это в пригодный для использования формат. Где я ошибся?

Ответ №1:

Предположим, что ваша таблица ключей ответов имеет вид Table1 и загружена в Powerquery

Для верхней таблицы загрузите в PowerQuery

Добавить столбец … индексный столбец …

Щелкните правой кнопкой мыши новый индексный столбец и … Отключите другие столбцы …

Главная.. Объединять запросы …

Установите для нижней таблицы значение Table1 и щелкните, чтобы сопоставить атрибут с VarName и значение с ResponseKey, с левым внешним соединением

введите описание изображения здесь

Щелкните стрелки над новым столбцом и [x] разверните ResponseLabel

Щелкните правой кнопкой мыши столбец значений и удалите

Нажмите кнопку выбрать столбец атрибута, затем Преобразовать .. сводные столбцы … значение = Метка ответа и Дополнительно= не агрегировать

введите описание изображения здесь

Щелкните правой кнопкой мыши индексный столбец и удалите

Выполнено

Полный код:

 let Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),
#"Merged Queries" = Table.NestedJoin(#"Unpivoted Other Columns",{"Attribute", "Value"},Table1,{"VarName", "ResponseKey"},"Table1",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"ResponseLabel"}, {"ResponseLabel"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Table1",{"Value"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[Attribute]), "Attribute", "ResponseLabel"),
#"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column",{"Index"})
in #"Removed Columns1"