将矩阵转换为 3 列表('反向透视'、'取消透视'、'展平'、'归一化')

Convert matrix to 3-column table ('reverse pivot', 'unpivot', 'flatten', 'normalize')

提问人:user3095042 提问时间:12/12/2013 最后编辑:pnutsuser3095042 更新时间:6/26/2021 访问量:93049

问:

我需要转换表中的Excel矩阵:FIRSTLATER

第一

    P1  P2  P3  P4
F1  X
F2  X   X
F3      X       X
F4      X   X

后来

F   P   VALUE
F1  P1  X
F1  P2
F1  P3
F1  P4
F2  P1  X
F2  P2  X
F2  P3
F2  P4
F3  P1
F3  P2  X
F3  P3
F3  P4  X
F4  P1
F4  P2  X
F4  P3  X
F4  P4
Excel 矩阵 数据 取消透视 PowerQuery

评论

1赞 Pankaj Jaju 12/12/2013
一个简单的谷歌会给你你的答案

答:

59赞 pnuts 12/12/2013 #1

要“反向枢轴”、“取消枢轴”或“展平”:

  1. 对于 Excel 2003:激活汇总表中的任意单元格,然后选择“数据 - 数据透视表”和“数据透视图报表”:

    SO20541905 first example

对于更高版本,请使用 +、 访问向导。AltDP

对于 Excel for Mac 2011,它是 ++(请参阅此处)。AltP

  1. 选择多个合并范围,然后单击 。Next

    SO20541905 second example

  2. 在“第 2a 步(共 3 步)”中,选择“我将创建页面字段”,然后单击 。Next

    SO20541905 third example

  3. 在“步骤 2b(共 3 步)”中,在“范围”字段中指定汇总表范围(示例数据为 A1:E5),然后单击 ,然后单击 。AddNext

    SO20541905 fourth example

  4. 在“第 3 步(共 3 步)”中,选择数据透视表的位置(应使用现有工作表,因为 PT 只是暂时需要):

    SO20541905 fifth example

  5. 单击以创建数据透视表:Finish

    SO20541905 sixth example

  6. 向下钻取(即双击)总计的交叉点(此处为单元格 V7 或):7

    SO20541905 seventh example

  7. 现在可以删除 PT。

  8. 通过在“快捷菜单”中选择“表”(在“”中单击鼠标右键)并“转换为范围”,可以将生成的表格转换为传统的单元格数组。

在Launch Excel上有一个关于同一主题的视频,我认为质量非常好。

评论

2赞 KyleMit 12/16/2014
pnuts,这真的很整洁,唯一的缺点是,如果数据在原始表中更新,它不会自动传播到新表。但是,否则,一个完美的解决方案!
1赞 Siddharth Rout 9/7/2015
++ 我能说什么?简单美丽的:)
0赞 JDC 3/11/2016
对 GrandTotal 的双击确实是一个隐藏功能。.还有一个不错的功能!
2赞 Stefan Steiger 9/11/2017
Alt+D,P-快捷方式在非英语 Excel 版本中不可用。有关解决方法,请参见 stackoverflow.com/questions/32115219/...
31赞 teylyn 12/28/2014 #2

在不使用 VBA 的情况下取消透视数据的另一种方法是使用 PowerQuery,这是 Excel 2010 及更高版本的免费加载项,可在此处获得:http://www.microsoft.com/en-us/download/details.aspx?id=39379

安装并激活Power Query加载项。然后按照下列步骤操作:

将列标签添加到数据源,并通过“插入>表”或“-”将其转换为 Excel 表。CtrlT

enter image description here

选择表中的任何单元格,然后在Power Query功能区上单击“从表”。

enter image description here

这将在 Power Query 编辑器窗口中打开该表。

enter image description here

单击第一列的列标题以将其选中。然后,在“转换”功能区上,单击“取消透视列”下拉列表,然后选择“取消透视其他列”。

对于没有“取消透视其他列”命令的 Power Query 版本,请选择除第一个列之外的所有列(按住 Shift 键单击列标题),然后使用“取消透视”命令。

enter image description here

结果是一张平坦的桌子。单击“主页”功能区上的“关闭并加载”,数据将加载到新的 Excel 工作表中。

enter image description here

现在是好的部分。例如,向源表添加一些数据

enter image description here

单击包含Power Query结果表的工作表,然后在“数据”功能区上单击“全部刷新”。您将看到类似以下内容的内容:

enter image description here

Power Query不仅仅是一次性转换。它是可重复的,可以链接到动态变化的数据。

评论

0赞 unubar 9/1/2018
谢谢。非常简单和非常强大的方法。最重要的是,数据是动态链接的!
0赞 pstraton 6/11/2019
瑰!非常感谢这个小教程。节省了大约数小时的实验时间。
2赞 Matt 11/14/2018 #3

到目前为止,所有解决方案都涉及 VBA、PowerQuery 等,这些解决方案很棒,但都是“一次性”事件。若要使其更具动态性,请考虑使用 INDEX(MATCH(...))。这将允许对表进行动态更新。

enter image description here

评论

0赞 pstraton 6/11/2019
此解决方案确实具有传统的 Excel 简单性,但请注意,上面的 teylyn 解决方案还允许以更自动化的方式进行动态更新。
1赞 Axuary 2/19/2021 #4

添加 LET 函数和动态数组允许这种非 VBA 解决方案。

=LET(data,B2:E5,
     dataRows,ROWS(data),
     dataCols,COLUMNS(data),
     rowHeaders,OFFSET(data,0,-1,dataRows,1),
     colHeaders,OFFSET(data,-1,0,1,dataCols),
     dataIndex,SEQUENCE(dataRows*dataCols),
     rowIndex,MOD(dataIndex-1,dataRows)+1,
     colIndex,INT((dataIndex-1)/dataRows)+1,
     dataColumn, IF(INDEX(data,rowIndex,colIndex)="","",INDEX(data,rowIndex,colIndex)),
     unfiltered, CHOOSE({1,2,3},INDEX(rowHeaders,rowIndex),INDEX(colHeaders,colIndex), dataColumn),
     filtered, FILTER(unfiltered, dataColumn<>""),
     unfiltered)

这将显示所有项目,包括那些具有空白数据的项目。若要消除空白,请将最后一个参数更改为 filtered。

0赞 mark fitzpatrick 6/26/2021 #5

还有一个要添加到BoK中。这需要 Excel 365。它将 B1:E5 的轴心取消为 A1:A5。

=LET( unPivMatrix, B1:E5,
      byMatrix, A1:A5,
        upC, COLUMNS( unPivMatrix ),
        byC, COLUMNS( byMatrix ),
        dmxR, MIN( ROWS( unPivMatrix ), ROWS( byMatrix ) ) - 1,
        dmxSeq, SEQUENCE( dmxR ) + 1,
        upCells, dmxR * upC,
        upSeq, SEQUENCE( upCells,, 0 ),
        upHdr, INDEX( INDEX( unPivMatrix, 1, ),  1,  SEQUENCE( upC ) ),
        upBody, INDEX( unPivMatrix,  dmxSeq,  SEQUENCE( 1, upC ) ),
        byBody, INDEX( byMatrix,  dmxSeq,  SEQUENCE( 1, byC ) ),
        attr, INDEX( upHdr, MOD( upSeq, upC ) + 1 ),
        mux, INDEX( upBody, upSeq/upC + 1, MOD( upSeq, upC ) + 1 ),
        demux, IFERROR( INDEX(
                              IFERROR( INDEX( byBody,
                                              IFERROR( INT( SEQUENCE( upCells, byC,0 )/byC/upC ) + 1, MOD( upSeq, upC ) + 1 ),
                                                       SEQUENCE( 1, byC + 1 ) ),
                                        attr ),
                              upSeq + 1, SEQUENCE( 1, byC + 2 ) ),
                         mux ),
        FILTER(demux, mux<>"")
 )

注意:byMatrix 可以是一个包含多列的范围,它将 复制列的行值。例如,你可以有 byMatrix 的 A1:C5 和 D1:H5 的 unPivMatrix,它将复制 A2:C5 列值(忽略 A1)。