将矩阵转换为 3 列表('reverse pivot'、'unpivot'、'flatten'、'normalize')

Posted

技术标签:

【中文标题】将矩阵转换为 3 列表(\'reverse pivot\'、\'unpivot\'、\'flatten\'、\'normalize\')【英文标题】:Convert matrix to 3-column table ('reverse pivot', 'unpivot', 'flatten', 'normalize')将矩阵转换为 3 列表('reverse pivot'、'unpivot'、'flatten'、'normalize') 【发布时间】:2019-12-07 12:34:34 【问题描述】:

我需要转换表格LATER中的Excel矩阵FIRST

第一

    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

【问题讨论】:

一个简单的谷歌会为您获取您的answer 【参考方案1】:

还有一个要添加到 BoK 中。这需要 Excel 365。它通过 A1:A5 取消透视 B1:E5。

=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)。

【讨论】:

【参考方案2】:

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)

这将显示所有项目,包括具有空白数据的项目。为了消除空白,将最后一个参数更改为过滤。

【讨论】:

【参考方案3】:

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

【讨论】:

此解决方案确实具有传统 Excel 的简单性,但请注意,上述 teylyn 的解决方案还允许动态更新,并且以更加自动化的方式。【参考方案4】:

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

    对于 Excel 2003:激活汇总表中的任何单元格并选择数据 - 数据透视表和数据透视图报告:

对于更高版本,使用 Alt+DP 访问向导。

对于 Excel for Mac 2011,它是 +Alt+P (See here)。

    选择多个合并范围并点击下一步

    在“Step 2a of 3”中,选择我将创建页面字段,然后单击下一步

    在“Step 2b of 3”中,在 Range 字段(示例数据为 A1:E5)中指定汇总表范围,然后点击 Add,然后点击 下一个

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

    点击完成创建数据透视表:

    向下钻取(即双击)总计的交叉点(此处为 Cell V7 或 7):

    现在可以删除 PT。

    可以通过选择快速菜单中的表格(在表格中右键单击)和转换为范围,将生成的表格转换为传统的单元格数组。

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

【讨论】:

pnuts,这真的很简洁,唯一的缺点是如果原始表中的数据更新,它不会自动传播到新表。但是,否则,一个完美的解决方案! ++ 我能说什么?简直太美了:) 双击 GrandTotal 确实是一个隐藏功能.. 一个不错的功能! ALT+D,P-快捷方式在非英文 Excel 版本中不可用。有关解决方法,请参阅 ***.com/questions/32115219/…。【参考方案5】:

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

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

为您的数据源添加列标签,并通过 Insert > Table 或 Ctrl - T 将其转换为 Excel 表格。

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

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

单击第一列的列标题将其选中。然后,在 Transform 功能区上,点击 Unpivot Columns 下拉菜单并选择 Unpivot other columns

对于没有 Unpivot other columns 命令的 Power Query 版本,选择除第一列之外的所有列(使用 Shift 键单击列标题)并使用 Unpivot 命令。

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

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

单击带有 Power Query 结果表的工作表,然后在数据功能区上单击全部刷新。你会看到类似的东西:

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

【讨论】:

谢谢。非常简单且非常强大的方法。最重要的是,数据是动态链接的! 太棒了!非常感谢这个小教程。节省了大概几个小时的实验时间。

以上是关于将矩阵转换为 3 列表('reverse pivot'、'unpivot'、'flatten'、'normalize')的主要内容,如果未能解决你的问题,请参考以下文章

列表方法reverse注意点

将邻接列表转换为 R 中的二进制矩阵

python3.x中怎么用matplotlib画出x为一维列表矩阵,y为一维矩阵的图像

如何将字典转换为元组列表?

将两个列表转换为矩阵

如何将矩阵转换为 R 中的列向量列表?