如何将数据从矩阵转为向量?
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;
};
定义后,您可以像使用任何工作表内置函数一样使用此函数:
参考:
我有一个 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;
};
定义后,您可以像使用任何工作表内置函数一样使用此函数: