我应该使用什么函数来按二维数组中的列对每一行进行排序?

问题描述 投票:0回答:1

下面的公式生成数组 cols 中数字的排列 - 在本例中为 1 到 6。 perms 变量输出没有重复的排列的二维数组。

但是,我想要得到组合,而不是排列。因此 1,2,4 与 4,2,1 相同。我的想法是对每一行进行排序,然后过滤掉重复的行。每个变量都按预期工作,直到最终的 SORT 部分,即 BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))。这会产生#calc。

期望的行为:取前几行,变量perms是:

| 1 |   |  |  |  |  |
| 2 |   |  |  |  |  |
| 3 |   |  |  |  |  |
| 4 |   |  |  |  |  |
| 5 |   |  |  |  |  |
| 6 |   |  |  |  |  |
| 1 | 2 |  |  |  |  |
| 1 | 3 |  |  |  |  |
| 1 | 4 |  |  |  |  |
| 1 | 5 |  |  |  |  |
| 1 | 6 |  |  |  |  |
| 2 | 1 |  |  |  |  |

使用LAMBDA函数,它应该变成:

| 1 |   |  |  |  |  |
| 2 |   |  |  |  |  |
| 3 |   |  |  |  |  |
| 4 |   |  |  |  |  |
| 5 |   |  |  |  |  |
| 6 |   |  |  |  |  |
| 1 | 2 |  |  |  |  |
| 1 | 3 |  |  |  |  |
| 1 | 4 |  |  |  |  |
| 1 | 5 |  |  |  |  |
| 1 | 6 |  |  |  |  |
| 1 | 2 |  |  |  |  |

换句话说,行 [2, 1] 应转换为 [1, 2],行 [4, 3] 应转换为 [3, 4],依此类推。

公式为:

=LET(
  cols, SEQUENCE(1, COLUMNS(TableStu)),
  firstperm, VALUE(CONCAT(cols)),
  lastperm, VALUE(CONCAT(SORT(cols,,-1,TRUE))),
  diff, (lastperm-firstperm)+1,
  list, SEQUENCE(diff, 1, firstperm),
  wanted, FILTER(list, LEN(REDUCE(list, cols, LAMBDA(m,j, SUBSTITUTE(m,j,"")))) = 0),
  all, FILTER(wanted, wanted <> "", ""),
  repeaters, UNIQUE(TOCOL(IF(LEN(all)-LEN(SUBSTITUTE(all,cols,""))=0, all, ""))),
  repsnoblanks, FILTER(repeaters, LEN(repeaters) > 0),
  allnoreps, FILTER(all, NOT(ISNUMBER(XMATCH(all, repsnoblanks)))),
  allAndLess, VALUE(TOCOL(VSTACK(allnoreps, LEFT(allnoreps, SEQUENCE(1, 4))))),
  nums, UNIQUE(SORT(FILTER(allAndLess, NOT(ISNA(allAndLess))))),
  starts, IF(REDUCE(cols, MAX(cols), LAMBDA(x,y, cols <= MAX(cols))), cols, ""),
  perms, IFERROR(VALUE(MID(nums, starts, 1)), ""),
  BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))
)

我尝试过的: 将 perms 更改为

IFERROR(VALUE(MID(nums, starts, 1)), "")
IFERROR(VALUE(MID(nums, starts, 1)), 0)
或者
IFERROR(VALUE(MID(nums, starts, 1)), 9999)

仍然给出#calc。

我知道我的公式包含很多步骤,而且非常违反直觉,而且可能效率低下。但是,我需要一个完全基于公式的解决方案,因为这必须应用于无法处理刷新电源查询的非技术用户,更不用说启用 vba 和运行宏了。如果您能想出一个更易读和更有效的公式来处理像 cols 这样的数字数组,请告诉我。

编辑:SORT(perms,,,TRUE)不会给出与perms有任何不同的结果。也就是说,首先显示的表格将保持不变。看来byrow只能处理单列,那么我应该使用什么函数呢?

excel excel-formula lambda combinations
1个回答
0
投票

在 Excel 中,除了

REDUCE
之外,lambda 辅助函数的“LAMBDA”部分无法返回数组。这就是为什么下面的公式不起作用

BYROW(perms,LAMBDA(row,SORT(row,,,TRUE)))

尝试这样的事情

REDUCE("",SEQUENCE(ROWS(perms)),LAMBDA(acc,i,VSTACK(acc,SORT(INDEX(perms,i),,,TRUE))))

但是,如果您的目标是返回给定集合的所有子集的集合,您可以简单地使用

MID(REDUCE("",set,LAMBDA(a,c,VSTACK(a,a&","&c))),2,9^9)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.