在excel中进行recursion查找
我想在Excel中做一些数据validation,但有一个困难,使vlookup
工作recursion。 这是一个小样本的数据
+---------------+-----------------+ | Duration(sec) | Start time(sec) | +---------------+-----------------+ | 1.428571429 | 96.57142857 | | 1.888888889 | 95 | | 1.888888889 | 96.22222222 | | 2.428571429 | 95.71428571 | | 2.75 | 96 | | 2.8 | 95.3 | | 2.846153846 | 94.30769231 | | 2.857142857 | 97.42857143 | | 3 | 94.8 | | 3 | 97 | | 3 | 99 | | 3.111111111 | 95.66666667 | | 3.2 | 95.5 | | 3.333333333 | 96.22222222 | | 3.416666667 | 80.33333333 | | 3.416666667 | 94.16666667 | | 3.5 | 94.1 | | 3.615384615 | 78.92307692 | +---------------+-----------------+
第一列是一个事件的持续时间,第二个是起点。 我需要find例如持续时间最小的5个项目的平均起始点。
我开始是这样的: {=AVERAGE(SMALL(IF(ISNUMBER(B:B),B:B,""),ROW(INDIRECT("1:5"))))}
这给我的平均5最小持续时间。 到现在为止还挺好。 它的工作原理应该如此。
然后尝试将上面的内容与vlookup
混合,以便在第一步中返回5个最小的持续时间,然后查找相应的起始点,然后计算它们的平均值。 我尝试过: {=AVERAGE(VLOOKUP(SMALL(IF(ISNUMBER(B:B),B:B,""),ROW(INDIRECT("1:5"))),B:C,2,FALSE))}
但没有运气。 VLOOKUP
似乎只返回一个值。 所以我不能像这样使用它。 有任何想法吗?
PS我使用ISNUMBER
因为我在数据中有NaN值。
尝试这个:
{=SUMPRODUCT(IF(DurNoErrors<=SMALL(DurNoErrors,5),TRUE,FALSE)*Start_Time)/5}
重要提示:请注意,这是一个数组公式,因此必须用Ctl + Shift + Enterinput。 该公式也适用于非数组论坛,但是如果input正常,它不会给你预期的结果! 所以只要确保你input数组公式。
DurNoErrors
是一个命名的范围设置为:
=IFERROR(Duration," ")
Duration
是为您的持续时间数据设置的命名范围。
Start_Time
是另一个命名范围设置为您的开始时间数据。
此数组公式的工作原理是:
- find第五个最小持续时间值
- 使用
IF()
根据每个值是否大于(FALSE)或小于/等于(TRUE),从Duration数组创build一个TRUE / FALSE值的数组,第五个最小值(结果数组将包含5 TRUE,其余的将是FALSE) - 将TRUE / FALSE数组乘以Start_Time数组,所有具有大于第五个最小值的Duration的Start_Times现在被清零
- 使用
SUMPRODUCT()
添加该数组,然后将结果除以5
使用IFERROR()
可以消除数组中的任何错误。
注意:对于您的命名范围,您不应使用例如A:A
。 而是使用类似A1:A100
东西,因为通常情况下,在公式中使用A:A
会显着减慢工作表的速度。 如果您愿意,您当然可以直接在上面的公式中input数据的地址,而不是使用已命名的范围(例如: A1:A18
而不是Duration
)。 不过, 命名范围是让你的公式更容易理解的好方法,当你回来一年后,并试图弄清楚你到底在做什么 。