【发布时间】: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 中有以下矩阵:
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。
有什么想法吗?
【问题讨论】:
假设我们有:
在E1中输入:
=INDEX($A$1:$C$3,ROUNDUP(ROW()/3,0),IF(MOD(ROW(),3)=0,3,MOD(ROW(),3)))
复制下来得到:
使用类似的公式,您可以将任何二维表映射到单行或单列。将单个列或行映射到表中同样容易。
【讨论】:
上面的答案非常好,但是恕我直言,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 提供了两种变体。
【讨论】:
这已经在第 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))
如参考文章中所述。
【讨论】:
我建议您检查Excel unpivot option 以执行您的任务。
From Table/Range
Unpivot Columns附近的箭头并选择最佳选项(如果您按照步骤3,您可以单击Unpivot only selected columns)此过程特别适用于复杂矩阵。
查看上面的链接了解更多信息
【讨论】:
对于将创建数组的通用方法,您可以使用:
=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 可以是任意形状的数组。
【讨论】:
使用当前版本的 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)<>"")
【讨论】: