【问题标题】:How to convert a matrix to a single column using Excel如何使用 Excel 将矩阵转换为单列
【发布时间】:2015-02-02 16:42:33
【问题描述】:

我在 Excel 中有以下矩阵:

3 列: A、B、C

第 1 行: a b c

第 2 行: d e f

第 3 行: ghi

我需要的是包含所有这些值的单列。结果应该是这样的:

一个

b

c

d

e

f

g

h

TRANSPOSE 函数不适用于这种情况。我尝试了 INDIRECT 功能,但没有找到解决方案。我宁愿用标准的 Excel 公式来处理它,而不是用 makro。

有什么想法吗?

【问题讨论】:

标签: excel matrix


【解决方案1】:

假设我们有:

E1中输入:

=INDEX($A$1:$C$3,ROUNDUP(ROW()/3,0),IF(MOD(ROW(),3)=0,3,MOD(ROW(),3)))

复制下来得到:



使用类似的公式,您可以将任何二维表映射到单行或单列。将单个列或行映射到表中同样容易。

【讨论】:

  • 我的相同方法的版本:=OFFSET($A$1,TRUNC((ROW()-1)/3),MOD(ROW()-1,3))
  • 发现@user3964075 版本更容易理解。使用德文版的 Excel。所以它是 =BEREICH.VERSCHIEBEN($A$1;KÜRZEN((ZEILE()-1)/3);REST(ZEILE()-1;3))。可能是即使在英文版中,逗号也必须用分号代替。无法测试它。如果有,请更正。
  • 我有一个矩形矩阵。哪 3 代表矩阵行,哪 3 代表矩阵列。
  • 嗨,你能用矩形矩阵更新答案吗?我不知道哪个 3 是行,哪个是列
【解决方案2】:

上面的答案非常好,但是恕我直言,Chip Pearson 提供的解决方案 (http://www.cpearson.com/excel/TableToColumn.aspx) 在大多数方面都是优越的,因为它立即/自动:

1) 自行确定 Row/Col delim 值,并立即适用于矩形,例如上面的一个必须明确输入 3 表示 num Cols 和 3 表示 num Rows,并且还必须弄清楚哪个是哪个。而 Pearson 的解决方案会自动执行此操作(例如,上面 rmf 的评论/关注)。

2) Pearson 为 Col-ordered 和 Row-ordered 提供了两种变体。

【讨论】:

    【解决方案3】:

    这已经在第 2 条中进行了介绍

    Excel: Formulas for converting data among column / row / matrix

    目标范围的顶部单元格(例如,$H$1)应包含

    =INDEX($A$1:$C$3,INT((ROW()-ROW($H$1))/3)+1,MOD(ROW()-ROW($H$1),3)+1)
    

    $A$1:$C$3 包含您的源数据。 根据需要向下复制公式。

    你也可以使用

    =OFFSET($A$1,INT((ROW()-ROW($H$1))/3),MOD(ROW()-ROW($H$1),3))
    

    如参考文章中所述。

    【讨论】:

      【解决方案4】:

      我建议您检查Excel unpivot option 以执行您的任务。

      1. 选择您的矩阵
      2. 浏览 Data 选项卡中的 Get & Transform 部分,然后单击 From Table/Range
      3. 在新的 Power Query 编辑器中选择要取消透视的列
      4. 浏览转换选项卡中的任何列部分,单击Unpivot Columns附近的箭头并选择最佳选项(如果您按照步骤3,您可以单击Unpivot only selected columns)
      5. 关闭并加载

      此过程特别适用于复杂矩阵。
      查看上面的链接了解更多信息

      【讨论】:

        【解决方案5】:

        对于将创建数组的通用方法,您可以使用:

        =LET( Matrix, $A$1:$C$3,
              rM, ROWS( Matrix ),
              cM, COLUMNS( Matrix ),
              cells, SEQUENCE( 1, rM * cM, 0 ),
              INDEX( Matrix, INT( cells / cM ) + 1, MOD( cells, cM ) + 1 )
              )
        

        虽然这利用了 LET 函数,但它用于提高可读性。对于不使用 Excel365 的人来说,不使用 LET 也可以做到这一点,但是阅读起来很痛苦。

        如果您需要将结果作为列传递,请更改 SEQUENCE 中的参数顺序

        = LET( Matrix, $A$1:$C$3,
              rM, ROWS( Matrix ),
              cM, COLUMNS( Matrix ),
              cells, SEQUENCE( rM * cM, 1 , 0 ),
              INDEX( Matrix, INT( cells / cM ) + 1, MOD( cells, cM ) + 1 )
              ) )
        

        当然,A1:C3 可以是任意形状的数组。

        【讨论】:

          【解决方案6】:

          使用当前版本的 Excel,我意识到矩阵运算有了很大的改进。对于将矩阵转换为单列,我建议按以下方式组合 INDEX 和 SEQUENCE 函数:

          Matriz_to_Column_Formula:

          =INDEX(matrix_range, 
          TRUNC((SEQUENCE(ROWS(matrix_range)*COLUMNS(matrix_range),1,0,1))/COLUMNS(matrix_range)+1,0),
           MOD(SEQUENCE(ROWS(matrix_range)*COLUMNS(matrix_range),1,0,1),COLUMNS(matrix_range))+1)
          

          如果要删除空格:

          =FILTER(Matriz_to_Column_Formula, Matriz_to_Column_Formula<>"")
          

          这里有一个简短的解释:

          索引需要 3 个东西:矩阵源、行和列。您每次计算的行和列允许索引指向矩阵源中的特定元素。索引会根据需要为您提供尽可能多的元素,即 Rows*Columns。

          让我使用 SEQUENCE 扩展行和列以按每个元素导航:

          行:

          TRUNC((SEQUENCE(ROWS(matrix_range)*COLUMNS(matrix_range),1,0,1))/COLUMNS(matrix_range)+1,0)
          

          公式 SEQUENCE 将生成与矩阵一样多的元素,从 0 开始直到 Rows*Columns-1,并且除以列将仅指向特定行。使用 +1 是因为序列从 0 开始,INDEX Row 元素从 1 到 n 工作。 TRUNC 仅用于获取行的整数。

          列:

          MOD(SEQUENCE(ROWS(matrix_range)*COLUMNS(matrix_range),1,0,1),COLUMNS(matrix_range))+1
          

          在这里您应用相同的原则,使用 SEQUENCE 生成矩阵从 0 到 Rows*Columns-1 的尽可能多的元素,并通过获取序列和 Columns 之间的余数,您将指向您需要的列。

          好的,这是我的第一篇文章,希望这对任何人都有帮助。感谢您在很多场合的帮助!

          Excel 中的示例: Matrix to Single Column - Example in excel

          选项 1:

          =INDEX(C3:E7,
          TRUNC((SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1))/COLUMNS(C3:E7)+1,0),
          MOD(SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1),COLUMNS(C3:E7))+1)
          

          选项 2:

          =IF(INDEX(C3:E7,TRUNC((SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1))/COLUMNS(C3:E7)+1,0),MOD(SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1),COLUMNS(C3:E7))+1)="","",INDEX(C3:E7,TRUNC((SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1))/COLUMNS(C3:E7)+1,0),MOD(SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1),COLUMNS(C3:E7))+1))
          

          删除空:

          =FILTER(INDEX(C3:E7,TRUNC((SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1))/COLUMNS(C3:E7)+1,0),MOD(SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1),COLUMNS(C3:E7))+1),
          INDEX(C3:E7,TRUNC((SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1))/COLUMNS(C3:E7)+1,0),MOD(SEQUENCE(ROWS(C3:E7)*COLUMNS(C3:E7),1,0,1),COLUMNS(C3:E7))+1)<>"")
          

          【讨论】:

            猜你喜欢
            • 2020-08-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-09
            • 1970-01-01
            相关资源
            最近更新 更多