如何在GROUPBY的Lambda函数中引用两列计算求和比值?
解决Excel GROUPBY直接计算分组B总和/C总和的问题
问题原因
你之前的公式=GROUPBY(data[A],HSTACK(data[B],data[C]),LAMBDA(x,y,SUM(x)/SUM(y)))失效的核心原因是:当GROUPBY的第二个参数传入多列数据(比如HSTACK合并的B、C列)时,聚合用的Lambda函数只会收到一个参数——即当前分组对应的所有列组成的二维数组,而不是把B、C列拆分成x、y两个独立参数。所以y没有对应的数据,公式自然无法运行。
可行实现方式
直接在Lambda函数中,从分组的二维数组里提取B、C列的数据,分别求和后再做除法,有两种常用写法:
写法1:用CHOOSECOLS提取列(更直观)
=GROUPBY(data[A], HSTACK(data[B], data[C]), LAMBDA(group_data, SUM(CHOOSECOLS(group_data, 1))/SUM(CHOOSECOLS(group_data, 2))))
group_data代表当前分组的B、C列合并数组CHOOSECOLS(group_data,1)提取该组的B列数据,CHOOSECOLS(group_data,2)提取C列数据- 分别求和后做除法,直接得到分组的B总和/C总和
写法2:用INDEX提取列
如果习惯用INDEX,也可以写成:
=GROUPBY(data[A], HSTACK(data[B], data[C]), LAMBDA(group_data, SUM(INDEX(group_data,,1))/SUM(INDEX(group_data,,2))))
INDEX(group_data,,1)表示取group_data的第1列(B列),INDEX(group_data,,2)取第2列(C列)
额外简化思路
如果不想用HSTACK,也可以直接把B、C列作为GROUPBY的聚合对象,再用BYROW处理结果,但这种方式和你原来的两步法类似,只是合并成一个公式:
=BYROW(GROUPBY(data[A], HSTACK(data[B], data[C]), SUM), LAMBDA(row, CHOOSECOLS(row,2)/CHOOSECOLS(row,3)))
不过这种写法不如前面的单步GROUPBY+Lambda高效。
内容的提问来源于stack exchange,提问作者Hedva Kazin
相关产品推荐
相关产品推荐

