Ne *_* Mo 0 arrays excel permutation excel-formula
下面是 5 列 - 第 6 列包含所需的结果:5 列中的每个可能排列的名称。
两行只有两列有值 - 因此第 6 列中只有两种排列(由“;”分隔)。
一行有 4 个值,因此有 24 种排列。
抱歉,我无法弄清楚如何将 Excel 中的表格粘贴到 Stack 中,而无需全部重写。
真实数据集中的行可以有 1 个值、5 个值或介于两者之间的任何值。
这里的答案似乎只适用于二维数组 - 该数组是一维的。我想不出任何明显的方法来使其成为 2d 以便这些解决方案发挥作用,这似乎也不是一种有效的方法。上述答案中的一个公式如下(我查看了所有这些公式,但无法弄清楚如何使它们适应我的需求):
=LET(A,A1:C3,B,ROWS(A),C,COLUMNS(A),D,B^C,E,UNIQUE(MAKEARRAY(D,C,LAMBDA(rw,cl,INDEX(IF(A="","",A),MOD(CEILING(rw/(D/(B^cl)),1)-1,B)+1,cl)))),FILTER(E,MMULT(--(E<>""),SEQUENCE(C,,,0))=C))
Run Code Online (Sandbox Code Playgroud)
我在 google 上搜索到的大多数解决方案似乎也无法在 1 行 5 列的简单数组上工作(或者我无法让它们工作)。
我尝试从头开始做,最终生成了一个仅包含数字 1-5 并且没有重复的数字列表 -
=LET(firstperm,VALUE(CONCAT(SEQUENCE(1,COLUMNS(Tablestu[@[First Name]:[Preferred Last Name]])))),lastperm,VALUE(CONCAT(SORT(SEQUENCE(1,COLUMNS(Tablestu[@[First Name]:[Preferred Last Name]])),,-1,TRUE))),diff,(lastperm-firstperm)+1,list,SEQUENCE(diff,1,firstperm),wanted,(IF((ISNUMBER(SEARCH("1",list))*ISNUMBER(SEARCH("2",list))*ISNUMBER(SEARCH("3",list))*ISNUMBER(SEARCH("4",list))*ISNUMBER(SEARCH("5",list))),list,"")),FILTER(wanted,wanted<>"",""))
Run Code Online (Sandbox Code Playgroud)
我想我可以以某种方式拆分这 5 位数字,并使用 INDEX 公式按该顺序返回单词。即 31452 将返回第三个单词,然后是第一个,然后是第四个,依此类推......但我仍然需要一百万次键盘头粉碎才能将其变成我需要的东西,而且它的效率将是愚蠢的低效当我到达那里时。
链接的答案似乎是正确的事情 - 我正在使用 Excel 365,我需要一个使用公式而不是 VBA 或 power query 的解决方案。
LAMDA 和 LET 都很好。
替代解决方案:
=LET(range, A1:E1,
f, FILTER(range,range<>""),
c, COLUMNS(f),
s, c^c,
a, MAKEARRAY( s, c,
LAMBDA( rw, cl,
MOD(CEILING(rw/(s/(c^cl)),1)-1,c)+1)),
p, FILTER(a,
BYROW( a,
LAMBDA( x,
AND(MMULT(N(TRANSPOSE(x)=x),SEQUENCE(c)^0)=1)))),
TEXTJOIN(";",,UNIQUE(BYROW(p,LAMBDA(x,TEXTJOIN("",1,CHOOSECOLS(f,x)))))))
Run Code Online (Sandbox Code Playgroud)
这还考虑到如果在范围内使用重复的名称,则不会生成重复的排列。
编辑: 基于Bo Rydobon 在 Linked In 上建议的版本的解决方案(感谢 Bo,非常感谢!)。
=LET(z,TOROW(A2:L2,3),TEXTJOIN(";",,REDUCE(TOCOL(z),DROP(z,,1),LAMBDA(a,w,TOCOL(IFS(ISERR(FIND(z,a)),a&z),3)))))
Run Code Online (Sandbox Code Playgroud)
这仍然给我们留下了单元格的字符限制,但我们也可以溢出范围:
=LET(z,TOROW(A2:L2,3),REDUCE(TOCOL(z),DROP(z,,1),LAMBDA(a,w,TOCOL(IFS(ISERR(FIND(z,a)),a&z),3))))
Run Code Online (Sandbox Code Playgroud)
这允许最多 9 个包含要排列的字符串的不同单元格,之后我们遇到 Excel 工作表行的边界,它会抛出错误。
| 归档时间: |
|
| 查看次数: |
314 次 |
| 最近记录: |