Excel 列间数据的集合运算(交集,并集,差集)
工作中有时会遇到两组或多组数据求交集或并集的情况,而 Excel 本身并不支持直接的集合运算,对于集合运算,需要用一系列函数进行配合才能完成,做起来麻烦,也不容易理解。这里介绍一个做集合运算的好方法,使用一个 Excel 插件 SPL,就可以直接进行集合运算。
1. 两列数据的集合运算
两列数据,在 SPL 中可以直接用运算符交 ^,并 &,差 \ 来实现,简单明了,
例如:
有一月份和二月份销售额排名前十的产品列表:
(1)求交集
找出一二月份均进入前十的产品名单
操作很简单,在 Excel 空白处输入如下代码:
=spl("=?1^?2",B2:B11,C2:C11)
如图
然后 ctrl-enter,直接返回结果
代码解释:=spl() 表示调用 SPL 插件,?1 和?2 表示参与计算的数据参数,这里分别指 B2:B11 和 C2:C11,^ 是交集运算符,因此?1^?2 就是求两组数据的交集。
类似,还可以求并集和差集
(2)求并集
找出有一次以上进入前十的产品名单:
=spl("=?1&?2",B2:B11,C2:C11)
(3)求差集
找出一月份进了前十但是二月份没有进前十的产品名单:
=spl("=?1\?2",B2:B11,C2:C11)
找出二月份进了前十但是一月份没有进前十的产品名单:
=spl("=?2\?1",B2:B11,C2:C11)
2. 多列数据的集合运算
多列数据的集合运算同样也可以延用两列数据的写法,即用?1^?2^?3……的形式来实现,但是当列数较多时,写起来还是有些麻烦,每列都要传一次数据。
方便的是,SPL 里还提供了函数 isect(),union(),diff() 可以直接求多组数据的交,并,差
例如:
有今年前几个月的销售额排名前十的产品列表 (随着时间的推移,月数会增加):
(1)多列数据求交集
找出这几个月全部进了前十的产品名单
=spl("=transpose(?1).isect()",B2:E11)
然后 ctrl-enter,返回计算结果,可以看到有两款产品前4个月销售额都进了前十
代码解释:=spl() 表示调用 SPL 插件,?1表示参与计算的数据参数,这里指B2:E11,读入 SPL 后会以多维矩阵的形式 [["Sasquatch Ale", "Northwoods Cranberry Sauce", "Aniseed Syrup","Chef Anton's Gumbo Mix"],["Steeleye Stout","Original Frankfurter grüne So?e","Chef Anton's Cajun Seasoning", "Sasquatch Ale"],……,["Louisiana Hot Spiced Okra", "Flotemysost","Gnocchi di nonna Alice", "Escargots de Bourgogne"]] 参与计算。
isect()求多组数据的交集,因为要对每列数据求交集,因此要先用 transpose() 转置一下
这种写法可以一次传入所有数据,而且不限列数。
类似的,还可以求多列数据的并集和差集
(2)多列数据求并集
找出有一次以上进了前十的产品名单:
=spl("=transpose(?1).union()",B2:E11)
计算结果较长,这里省略了。
(3)多列数据求差集
找出一月份进了前十但是其它月份均没有进前十的产品名单:
=spl("=transpose(?1).diff()",B2:E11)
在 Excel 里不支持的运算,借助一个插件轻松解决!!!
其实SPL的功能远不止此,它提供了很多灵活的数据处理函数,能够处理各种复杂Excel操作,写法也简单,用它来辅助 Excel 计算,工作效率秒翻倍。
并且 SPL 还配套有丰富的参考案例esProc 桌面版与 Excel 处理,职场上 90% 的 Excel 问题都能在这本书中找到答案。书中的代码基本上复制过去,稍加改改就可使用。
SPL 下载地址:esProc Desktop Download
插件安装方法:SPL XLL 安装与配置
英文版
演示数据:Excelrar