如何将数据从矩阵转为向量? [复制]

Posted

技术标签:

【中文标题】如何将数据从矩阵转为向量? [复制]【英文标题】:How to unpivot data from a matrix to a vector? [duplicate] 【发布时间】:2020-02-26 09:40:10 【问题描述】:

我有一张这样的表格:

+---------------------------+
|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   |
+------+-------+--------

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

非常感谢您在正确方向上的任何帮助或推动。

【问题讨论】:

Search 【参考方案1】:

方法一:使用内置函数:

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

方法二:使用 Apps Script 自定义函数:

您可以使用 Apps 脚本 Custom Function 来做到这一点。

首先,通过选择Tools &gt; Script editor打开一个绑定脚本,并将以下函数复制到脚本中(检查内联cmets):

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;
;

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

参考:

Custom Functions in Google Sheets

【讨论】:

以上是关于如何将数据从矩阵转为向量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从矩阵、向量等中删除因子? [复制]

将一行向量转为每行相同的矩阵

如何通过在 Rcpp 或 Armadillo 中将矩阵乘以向量元素来复制 R 的功能?

当我想将数据从堆栈移动到向量时如何避免复制?

将矩阵中的列向量复制到opencv中另一个矩阵的每个列中

如何将包含矩阵的文件读取为向量的向量?