如何使用Excel将矩阵转换为单个列

时间:2015-02-02 16:42:33

标签: excel matrix

我在Excel中有以下矩阵:

3列: A,B,C

第1行: a b c

第2行: d e f

第3行: ghi

我需要的是一个包含所有这些值的列。结果看起来应该是这样的:

B'/ P>

C

d

ë

˚F

ħ

TRANSPOSE功能不适用于该情况。我尝试了INDIRECT功能,但没有找到解决方案。我更愿意使用标准Excel公式而不是makro来处理它。

有什么想法吗?

6 个答案:

答案 0 :(得分:6)

说我们有:

enter image description here

E1 中输入:

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

并复制以获取:

enter image description here



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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

第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))

在所提到的文章中提及。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

=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 可以是任意形状的数组。

答案 5 :(得分:1)

使用当前版本的 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<>"")

这里是一个简短的解释:

索引需要三样东西:矩阵源、行和列。您每次计算的行和列允许索引指向矩阵源中的特定元素。索引会根据您的需要为您提供尽可能多的元素,即 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 的元素一样多的元素,通过获取序列和列之间的余数,您将指向您需要的列。

好的,这是我的第一篇文章,希望对大家有所帮助。感谢您在许多场合的帮助!

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)<>"")