如何将数据从矩阵转为向量?

How to unpivot data from a matrix to a vector?

我有一个 sheet 结构如下:

+---------------------------+
|date  | jan 1 | jan2 |jan3 |
+---------------------------+
|empl1 | 3     |  5   |8    |
+---------------------------+
|empl2 | 4     |  7   |6    |
+---------------------------+
|empl3 | 1     |  2   |9    |
+---------------------------+

我想取消透视,所以它看起来像这样:

+------+-------+--------
|empl1 | jan 1 |   3   |
+----------------------+
|empl2 | jan 1 |   4   |
+----------------------+
|empl3 | jan 1 |   1   |
+----------------------+
|empl1 | jan2  |   5   |
+----------------------+
|empl2 | jan2  |   7   |
+----------------------+
|empl3 | jan2  |   2   |
+----------------------+
|empl1 | jan3  |   8   |
+----------------------+
|empl2 | jan3  |   6   |
+----------------------+
|empl3 | jan3  |   9   |
+------+-------+--------

有没有办法用公式来实现这个,如果有,怎么做?还是只能通过脚本来实现?

任何正确方向的帮助或推动将不胜感激。

方法一:使用内置函数:

=ARRAYFORMULA({SPLIT(TRANSPOSE(SPLIT(TEXTJOIN(":",FALSE,FILTER(A2:A&","&B1:D1&","&B2:D,A2:A<>"")),":",TRUE,FALSE)),",",TRUE,FALSE)})

方法 2:使用 Apps 脚本自定义函数:

您可以使用 Apps 脚本执行此操作 Custom Function

首先,通过选择 Tools > Script editor 打开绑定脚本,并将以下函数复制到脚本中(检查内联注释):

function matrixToVector(values) {
  var output = [];
  var headers = values.shift(); // Remove and retrieve the headers row  
  for (var i = 1; i < values[0].length; i++) { // Iterate through each column
    for (var j = 0; j < values.length; j++) { // Iterate through each row
      output.push([values[j][0], headers[i], values[j][i]]);
    }
  }
  return output;
};

定义后,您可以像使用任何工作表内置函数一样使用此函数:

参考: