如何使用 Google Sheets 公式将数据矩阵转换为关系 table?
How to convert a data matrix into a relational table using Google Sheets formula?
我有一组矩阵形式的数据,我正在尝试使用公式从该矩阵生成关系 table。这是我要实现的目标的说明:
矩阵:
| 3/5 | 4/5 | 5/5 |
---------------------------
Player1 | 1 | 0 | 1 |
Player2 | 0 | 1 | 2 |
Player3 | 1 | 1 | 2 |
目标:
Player | Date | Value |
------------------------
Player1 | 3/5 | 1 |
Player3 | 3/5 | 1 |
Player2 | 4/5 | 1 |
Player3 | 4/5 | 1 |
Player1 | 5/5 | 1 |
Player2 | 5/5 | 2 |
Player3 | 5/5 | 2 |
查看真实数据:
https://docs.google.com/spreadsheets/d/1DNaoBnYMNbznUoAJahW9-UfGq6LbTG3TXgXPz90bWas
无论如何,我按照answer中的说明得出了这个公式:
=ArrayFormula(QUERY(VLOOKUP(HLOOKUP(matrix!A3,matrix!A3:A,INT((ROW(matrix!A3:A)-
ROW(matrix!A3))/COLUMNS(matrix!B1:Z1))+1,0),{matrix!A3:T, IF(ROW(matrix!A3:A),
matrix!B1:Z1)}, {SIGN(ROW(matrix!A3:A)), MOD(ROW(matrix!A3:A) -
ROW(matrix!A3), COLUMNS(matrix!B1:Z1)) + {2, 2+COLUMNS(matrix!B1:Z1)} }, 0 ),
"select Col1, Col3, Col2 where Col2 is not null and Col2 != 0 order by
Col3,Col2", 0))`
它在某种程度上确实有效,但缺点是它在矩阵 sheet 中使用了很多空行来生成行,并且实际上要求矩阵 sheet 具有最少 numCols*numRows 行数。现在我可以向矩阵添加 3500 个空行并完成它,但不知何故感觉应该有更好的方法。关于如何改进它有什么想法吗?
=ARRAYFORMULA({"Player", "Date", "Value";
SORT(SPLIT(TRANSPOSE(SPLIT(TRIM(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
IF(Sheet1!B2:Z<>"","♠"&Sheet1!A2:A&"♦"&Sheet1!B1:1&"♦"&Sheet1!B2:Z,)),,999^99)),,999^99)),
"♠")), "♦"), 2, 1, 1, 1)})
我有一组矩阵形式的数据,我正在尝试使用公式从该矩阵生成关系 table。这是我要实现的目标的说明:
矩阵:
| 3/5 | 4/5 | 5/5 |
---------------------------
Player1 | 1 | 0 | 1 |
Player2 | 0 | 1 | 2 |
Player3 | 1 | 1 | 2 |
目标:
Player | Date | Value |
------------------------
Player1 | 3/5 | 1 |
Player3 | 3/5 | 1 |
Player2 | 4/5 | 1 |
Player3 | 4/5 | 1 |
Player1 | 5/5 | 1 |
Player2 | 5/5 | 2 |
Player3 | 5/5 | 2 |
查看真实数据: https://docs.google.com/spreadsheets/d/1DNaoBnYMNbznUoAJahW9-UfGq6LbTG3TXgXPz90bWas
无论如何,我按照answer中的说明得出了这个公式:
=ArrayFormula(QUERY(VLOOKUP(HLOOKUP(matrix!A3,matrix!A3:A,INT((ROW(matrix!A3:A)-
ROW(matrix!A3))/COLUMNS(matrix!B1:Z1))+1,0),{matrix!A3:T, IF(ROW(matrix!A3:A),
matrix!B1:Z1)}, {SIGN(ROW(matrix!A3:A)), MOD(ROW(matrix!A3:A) -
ROW(matrix!A3), COLUMNS(matrix!B1:Z1)) + {2, 2+COLUMNS(matrix!B1:Z1)} }, 0 ),
"select Col1, Col3, Col2 where Col2 is not null and Col2 != 0 order by
Col3,Col2", 0))`
它在某种程度上确实有效,但缺点是它在矩阵 sheet 中使用了很多空行来生成行,并且实际上要求矩阵 sheet 具有最少 numCols*numRows 行数。现在我可以向矩阵添加 3500 个空行并完成它,但不知何故感觉应该有更好的方法。关于如何改进它有什么想法吗?
=ARRAYFORMULA({"Player", "Date", "Value";
SORT(SPLIT(TRANSPOSE(SPLIT(TRIM(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
IF(Sheet1!B2:Z<>"","♠"&Sheet1!A2:A&"♦"&Sheet1!B1:1&"♦"&Sheet1!B2:Z,)),,999^99)),,999^99)),
"♠")), "♦"), 2, 1, 1, 1)})