背瓜群众 发表于 2021-11-11 17:58:00

关于choose函数与数组的一些分享和疑问

最近在试图使用choose函数来选定一些数组的内容,但是发现其计算规则让人特别困扰,今天下午用大量例子测试总结了一下,顺便提一下疑问。

测试结果如上图所示,同时文档通过onedrive进行共享了,感兴趣的大佬可以打开在线编辑或打开下载,此处打开在线文档注意打开在线文档后新建一个sheet复制内容过去编辑测试
主要测试的方向为choose的index_num参数和value参数都为数组时的情况,所以A1:I1,A2:I2,A3:I3区域为三个用做value的数组,且为了方便观察取值位置把值分别填成1.1-1.9,2.1-2.9,3.1-3.9,这样可清晰分辨从哪个数组取到哪个位置的值。
K1:U14为计算结果区域,L列函数为实际运行的函数(值得关注的参数变化用红字表示),右侧M列开始为函数运行的结果,通过evaluate宏表函数计算的。
注:CHOOSE 函数语法具有以下参数:
index_num必需。 用于指定所选定的数值参数。 index_num 必须是介于 1 到 254 之间的数字,或是包含 1 到 254 之间的数字的公式或单元格引用。value1, value2, ... Value1 是必需的,后续值是可选的。 1 到 254 个数值参数,CHOOSE 将根据 index_num 从中选择一个数值或一项要执行的操作。 参数可以是数字、单元格引用、定义的名称、公式、函数或文本。
__________________________________________________________________________________________
测试对比结果/结论:
从序号1和2测试,当index_num参数不为数组,为单个数值时,可见函数返回对应第几项的value参数,返回的数组长度也与实际返回value参数的长度相等,以上基本符合对运行结果的预期。
从序号3测试可见,当index_num为数组{1}时,返回为位置对应的value1数组,也符合结果预期。
从序号4测试可见,同样index_num为{1},对比3测试value1的数组缩减为仅有一个A1值,但此时结果得到了一个超出value1数组长度的数组,且整个数组被value1的第一个值填充,即1.1。
测试5,index_num为{2}时,结果为整个value2数据,符合预期。
测试6、7,接着研究测试4出现的:”结果返回超过预期长度的数组,其长度由什么控制?”测试6中缩减了value1和value2的长度,但返回还是与value1数组长度不同,缺少长度的位置填充了NA,可见跟选取的value数组长度没有关系。而测试7,缩减了3个value的长度后,结果长度也变化了,可见结果长度等于value中数组最长的长度。
至此可以得出结论
1.index_num为数值时,结果返回长度为选取value的长度。
2.index_num为数组时,结果返回长度为所有value数组中,长度最大数组的长度。
3.index_num为数组且仅有一个值时(如{1}),选取的value数组长度为1,则它的值会填充返回整个结果,选取的value数组长度大于1,则value小于结果长度的部分会被NA填充。


继续讨论测试8,当index_num参数为{1,2}时,可见仅返回两个结果,为value1的第1项(1.1),及value2的第2项(2.2),其余部分被NA替代。
结合测试9、10、11,当index_num变化时对结果产生的影响,可见结果实际取到数的长度为index_num的数组长度,其余部分被NA替代。其取值逻辑更为耐人寻味:
如index_num为{3,1}时,仅返回两个有效的结果为:3.1、1.2,首先确定index_num为长度不为1的数组时,仅返回对应value中的一项。而且可以看到其返回对应value中元素的在value中的位置与其在index_num被选取的位置相同,也就是如index_num为{3,1}中1所对应的value1(1.1-1.9),在{3,1}作为第2项被选取,其结果会出现在第2项,且选取的是value1中的第2个数(1.2)。结合测试12、13,可非常清晰地印证以上说法。
至此可以得出结论 :
4.index_num为数组且长度大于1时,结果仅返回index_num选取对应的value中与其被index_num选取位置相同位置的值,结果长度仍为所有value的最大长度,不足部分由NA填充。
(以上结论就远远超出了结果的预期,当index_num和value都为数组时,value被index_num选取的位置为N时,提取value中A元素到结果的位置也为N,A元素在value中的位置也为N,相当于用一个变量去控制两个不同实际意义的参数,例如要模拟某辆列车运行情况,时速 X km/h,以及车轮半径 Y cm,此时设定了X=Y=N,让你去控制N变量一样。即,1.你无法去控制需要的元素出现在结果对应的位置,2.在几个value数组中同一个位置的元素也无法同时返回到结果中)
最后看一下14测试,注意value2仅设定了A2,value3设定了A3:B3,当value2被index_num第二个选取,其仅有A2一个值时(2.1),长度不足无法取第二个元素时,则通过2.1填充。
但value3被index_num第三个选取,其有A3:B3两个值(3.1、3.2),长度不足无法取第三个元素时,却直接报NA。
综上所述,choose在index_num和value这两个参数都为数组时,却时产生了很多超出预期的结果,或者说显现了一些可以认为由缺陷的规则,希望各位大佬指点迷津。
留下个这个无法解决的问题,15中手动写了结果,没有写函数,如何在通过函数实现结果,要求value使用$A$1:$I$1,$A$2:$I$2,$A$3:$I$3?

思念的过去 发表于 2022-2-15 03:10:21

逗号{1,2} 改分号 {1;2} ,比如
=CHOOSE({1;2},A1:I1,A2:I2,A3:I3)
页: [1]
查看完整版本: 关于choose函数与数组的一些分享和疑问