不使用 VBA 将多列反转为两个不同的列

不使用 VBA 将多列反转为两个不同的列

我有一个数据集,其中包含数千行和多个水平扩展的问题和答案列。我想将所有“问题”列取消透视为一列,并对相应的“答案”列执行相同操作。

我的数据集如下:

Header1 Header2 Q1 A1 Q2 A2 560-19 Bill A A' B B' 560-33 Jay A A' B B' 560-34 Nick A A' B B' 490-31 Julia A A' B B' 490-32 Anna A A' B B' 490-33 Reed A A' B B' 900-87 Mick A A' B B'

我想把它变成这样:

Header1 Header2 Q A 560-19 Bill A A' 560-19 Bill B B' 560-33 Jay A A' 560-33 Jay B B' 560-34 Nick A A' 560-34 Nick B B' 490-31 Julia A A' 490-31 Julia B B' 490-32 Anna A A' 490-32 Anna B B' 490-33 Reed A A' 490-33 Reed B B' 900-87 Mick A A' 900-87 Mick B B'

我正在使用 Excel 365。

答案1

要在 Power Query 中执行此操作(大多数但不是全部步骤都可以在 UI 中完成),使用您的设置(并且可以使用多个 q/a 对列)尝试:

  • 选择两个标题列,然后Unpivot other columns
  • 添加索引列
  • 删除Attribute
  • 将 Index 列转换为整数除法列(除以 2),以创建一系列{0,0,1,1,2,2,...}
  • 根据转换后的索引列将行分组为一条记录这无法通过 UI 完成
  • 删除索引列
  • 展开分组列中的值并重命名新列AQ

原始数据

在此处输入图片描述

M 代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Header1", "Header2"}, "Attribute", "Value"),
    #"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
    #"Removed Columns" = Table.RemoveColumns(#"Added Index",{"Attribute"}),
    #"Integer-Divided Column" = Table.TransformColumns(#"Removed Columns", {{"Index", each Number.IntegerDivide(_, 2), Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Integer-Divided Column", {"Index", "Header1","Header2"},{{"Values", each Record.FromList([Value], {"Header1","Header2"}), type record}}),
    RemIndex = Table.RemoveColumns(#"Grouped Rows",{"Index"}),
    ExpandValues = Table.ExpandRecordColumn(RemIndex,"Values",{"Header1","Header2"},{"Q","A"}),
    #"Changed Type" = Table.TransformColumnTypes(ExpandValues,{{"Header1", type text}, {"Header2", type text}, {"Q", type text}, {"A", type text}})
in
    #"Changed Type"

结果

在此处输入图片描述

相关内容