Excel:用于在列/行/矩阵之间转换数据的公式

时间:2013-12-27 12:34:25

标签: excel matrix excel-formula transpose

是否有公式将列中的数据转换为矩阵或行? 并转换为/到其他组合?

更复杂的情况怎么样:将宽度为W的矩阵重新整形为宽度N * W?

有一些相似或相关的问题。 我已经回答了其中一些,标有*。 我不断更新此列表,因为添加了新的类似(或相同)问题:

Formatting Data: Columns to Rows *

Move content from 1 column to 3 columns *

how to split one column into two columns base on conditions in EXCEL *

writing a macro to transpose 3 columns into 1 row

Excel VBA transpose with characters

Mathematical transpose in excel

How do transform a "matrix"-table to one line for each entry in excel

Convert columns with multiple rows of data to rows with multiple columns in Excel.

How to use VBA to reshape data in excel *

Sorting three columns into six, sorted horizontally by surname using excel *

divide data in one column into more column in excel

Move data from multiple columns into single row *

有些答案似乎是可升级的"更具包容性的东西。 这可能吗?

要转换为/的样本格式为:

1
2
3
4
5
6
7
...

1   2   3   4   5   6   7   ...

矩阵(这里有4列的跨度)

1   2   3   4
5   6   7   8
...

1 个答案:

答案 0 :(得分:20)

这个想法是在这里给出一些可能会对上面列出的问题进行微调的东西,这也可以作为未来相关问题的参考。

要使用的基本功能是INDEXOFFSET。参考该图,将在明确的示例之后给出每个的优点和缺点。它显示了几个具有已定义名称的范围(在下面的斜体中)。 所有定义的名称都可以用对相应单元格的直接绝对引用来替换。

enter image description here

<强> 1。列到矩阵

span (在C1中)给出了列数。然后 matrix_data_top_left (这里的D1)包含

=INDEX(col_data,(ROW()-ROW(matrix_data_top_left))*span+(COLUMN()-COLUMN(matrix_data_top_left)+1),1)

然后将其复制到 matrix_data 的其余部分。 请注意,同时复制到D5会产生错误,因为生成的公式引用 col_data 之外的单元格(A1:A16)。 使用

matrix_data2_top_left (I1)中获得相同的结果
=OFFSET(col_data_top,(ROW()-ROW(matrix_data2_top_left))*span+(COLUMN()-COLUMN(matrix_data2_top_left)),0)

并类似地复制到 matrix_data2 。 请注意,同时复制到I5会返回0,而不是错误。

OFFSET的优点是只需要一个单元格用作基本引用( col_data_top ),因此使用更多数据扩展源数据范围不需要重新定义源数据公式中的范围,只需复制粘贴到扩展的目标范围。 另一方面,使用INDEX扩展源数据范围需要首先在公式中更新它(如果明确使用则更改范围),然后复制粘贴到扩展目标范围。使用定义的名称对于此目的更为通用,因为重新定义 col_data 就足够了(并且可以在扩展目标范围之后完成)。 由于这个属性相同,INDEX提供了一种对源范围的自动边界检查,OFFSET没有。

<强> 2。矩阵到列

col_data2_top 包含

=INDEX(matrix_data2,INT((ROW()-ROW(col_data2_top))/span)+1,MOD(ROW()-ROW(col_data2_top),span)+1)

col_data3_top

=OFFSET(matrix_data2_top_left,INT((ROW()-ROW(col_data3_top))/span),MOD(ROW()-ROW(col_data3_top),span))

两个公式都向下复制。 INDEXOFFSET之间存在相同的差异。

第3。矩阵排

由于OFFSET没有出错,剩下的公式将使用它。沿着上面的线条适应INDEX很容易。 row_data_left 包含

=OFFSET(matrix_data_top_left,INT((COLUMN()-COLUMN(row_data_left))/span),MOD(COLUMN()-COLUMN(row_data_left),span))

然后复制到右边。

<强> 4。列到行

row_data2_left 包含

=OFFSET(col_data_top,COLUMN()-COLUMN(row_data2_left),0)

再次复制到右边。

PS:公式=TRANSPOSE(...适用于这种情况,它应该作为数组公式输入(使用 ctrl + shift + 输入)。 Nevertheles,it might be desirable to avoid array formulas

<强> 5/6。行到列/矩阵

沿着这些方向很容易获得。 例如, col_data_top 包含

=OFFSET(row_data_left,0,ROW()-ROW(col_data_top))

并复制下来。

<强> 7。矩阵转置

要进入 matrix_data3 (图中未显示) matrix_data2 的转置,只需要使用 matrix_data3_top_left ,式

=OFFSET(matrix_data2_top_left,COLUMN()-COLUMN(matrix_data3_top_left),ROW()-ROW(matrix_data3_top_left))

并复制到合适的目标范围。

<强> 8。矩阵重塑

我们希望将矩阵重塑为更广泛的矩阵: matrix_data4 N4 行和 M4 列( width4 ),成 matrix_data5 N5 = N4 / R 行和 M5 = M4xR 列( width5 ), R rep5 )重复次数 (矩阵未在图中显示)然后使用

=OFFSET(matrix_data4_top_left,(ROW()-ROW(matrix_data5_top_left))*rep5+INT((COLUMN()-COLUMN(matrix_data5_top_left))/width4),MOD((COLUMN()-COLUMN(matrix_data5_top_left)),width4))

现在我们想要将矩阵重塑为更窄的矩阵: matrix_data4 N4 行和 M4 列( width4 ),成 matrix_data6 N6 = N4xS 行和 M6 = M4 / S 列( width6 ), S split6 )分割数 (矩阵未在图中显示)然后使用

=OFFSET(matrix_data4_top_left,INT((ROW()-ROW(matrix_data6_top_left))/split6),MOD((ROW()-ROW(matrix_data6_top_left)),split6)*width4+(COLUMN()-COLUMN(matrix_data6_top_left)))