在表格中一列60个单元格中输入一组数据(1、随机输入,不按大小顺序;2、可能还有空白单元格,空白单元格不计入统计个数。)
问题:如何用excel表格自动计算一组数据,按从大到小排列后,排在前2/3的数据的个数和平均值,以及排在后1/3的数据的个数和平均值?
说明:主要是要制作一个固定格式的表格,用于统计计算,后期只要输入数据后就可自动得出结果,所以不能对数据进行排序等操作,只能用公式/函数计算,头疼了。。。
补充一下,有几个要求的:
1、输入数据大小是随机,输入完成后不能再变动,也就是说不能对数据进行排序操作
2、输入时可能会有空白单元格,这些空白单元格是不纳入个数计算以及平均值计算的
3、求前2/3的数据的平均值,是这组数据按从大到小排序后的,排在前面的2/3个数的平均值
4、要求整个表格,完成后只要在固定区域(如A1:A60)中输入数据,即可自动计算出结果,其公式等设置好后不能变动
公式/函数小弟只懂一点皮毛,面对这些变态要求,崩溃了,求教高手 orz
另外,答案中最好能带上一点解说,小白们万分感激!
首先,非常感谢您的回答,但是这个我在表中试了一下,计算的是直接输入完成后,位置排在前面2/3(或后1/3)的数据的平均值,而非大小排序,问题我又补充详述了一下要求,请了解!
追答我的解答并非是大小排序
B列是对每个数据进行编号
然后根据编号判断是否是前2/3,并进行求和
应该是符合要求的
请仔细理解公式的含义
了解B列编号的用意是排除空格,这个ideal非常不错!
但是计算的时候,要求是数据按从大到小排列后,取前2/3的数据计算平均值。
比如说我在A1:A45中输入了数据,按上面的公式计算前2/3的数据的平均值,是算的A1:A30的平均值,而我想要的是A1:A45中数据按从大到小排列后,排在前面2/3的数据的平均值,也就是说,取最大的2/3部分的数据求平均值。
这个可以参考网友 骨头81 给的公式,只是他的公式没有考虑空格,望解惑!
哦,不好意思,我理解错了,原来还需要按大小统计
那么有一个问题
如果有相同的数据,该如何取值?
比如只有9个数据,假设就是1,2,3,4,5,6,6,6,7
取前2/3的数据应该是1,2,3,4,5,6
那么另外的两个6是否不需要计算?
另外两个6不需要计算,这种算法我也想过,就是设置出在2/3位置的临界数,然后用大于等于临界数的总和除以个数,得出平均值。但是这种计算方法在出现临界数有多个重复的时候,结果会有偏差,不符合要求
追答明白了
请将B列的辅助编号公式改为:
=IF(A1="","",RANK(A1,$A$1:$A$60,1)+COUNTIF(A$1:A1,A1)-1)
计数和统计公式不变
够简洁!
不过,大哥,前面说的空白单元格貌似也算进来了,比如说,60个单元格,只输入了45个数据,那么前2/3的数据的个数应该只有30个,计算平均值应该也是只有这30个数据来算
另外,SMALL(A1:A60,ROW(A1:A40)),高段的组合计算?小白没看懂,可以解说一下吗,真心求教
要将空白单元格排除在外:
B1输入=ROUND(COUNTA(A1:A60)*(2/3),0) shift+ctrl+enter 三键结束,求的是A1:A60中非真空单元格的个数的2/3,经四舍五入后的值。
C1输入 =AVERAGE(LARGE(A1:A60,ROW(INDIRECT("A1:A"&B1)))) shift+ctrl+enter 三键结束
求得是A1:A60中从大到小排序后,前2/3的数的平均值。
D1输入=ROUND(COUNTA(A1:A60)*(1/3),0) shift+ctrl+enter 三键结束,求的是A1:A60中非真空单元格的个数的1/3,经四舍五入后的值。
E1输入=AVERAGE(SMALL(A1:A60,ROW(INDIRECT("A1:A"&D1)))) shift+ctrl+enter 三键结束
求得是A1:A60中从大到小排序后,后1/3的数的平均值。
shift+ctrl+enter 是数组公式,你还是看看书吧,这里说不明白。
如果数据中有较多重复项,特别在2/3临界的地方有多个数据相等的话,计算结果会有偏差,可以参考网友 一百℃猪 回答中最后一组9个数的例子,所以这个问题是比较麻烦的
追答是啊,不好意思,忘了这茬,如果在2/3之前有重复值是无所谓的,关键就是在2/3前后值相同的话就不好弄了,同求高人指点
我想到了,为了能够解释清楚和发现其中的错误,我们一步一步来,还是需要插入辅助列(排名列),不过要用到VLOOKUP,所以这个辅助列查到前面去,A列为排名,B列为数据
假设数据为
数据 3 4 4 4 4 5
排序 1 2 2 2 2 6
(不想排版,实际为竖排)
C1和D1任然是上面的意义,
讨论在2/3处出现重复值,则必然count(A1:A60,"D1,那么要取得小于排名为D1的最大一个数和前面的那些数
=MAX(IF(A1:A60<D1,A1:A60))
按ctrl+shift+enter三键结束.
得出小于D1的那个最大排名,我们把这个公式放在E1中。
得到了E1,那么E1对应的那个避免被重复计算的最大值为F1=VLOOKUP(E1,A1:B60,2,0)
实际要计算的次数为 D1-(E1-1)
下面开始来做这个最终的公式
=if(count(A1:A60,"<=D1")<=D1,averageif(A1:160,"<=D1",B1:B60),(sumif(A1:A60,"<E1",B1:B60)+(D1-E1+1)*F1)/D1)
这种方法可行,公式还可以调整一下,这样如果有空格会好看一点,=IF(ISERROR(LARGE(A$1:A$60,ROW())),"",LARGE(A$1:A$60,ROW()))
但也还有一个问题,就是如果有空的单元格,如何计算有效数据的个数,后续求平均值需要用到的
补充要求:数据的值未确定范围