分享

列表数据处理:差集 - Excel函数式编程

 ExcelEasy 2024-07-12 发布于北京


继续介绍列表数据处理。

上一次我们介绍了列表数据的交集(列表数据处理:交集 - Excel函数式编程)。

今天我们介绍列表的差集。

假设两个集合分别是A,B,其差集A - B指的是只在A中出现,不在B中出现的元素:

以实际例子来说,

A列表示setA,C列表示setB,

setA - setB的结果就是:

{a, c}。

思路

上一节我们介绍了交集的实现,其自定义函数这这么定义的,

Intersect = LAMBDA(setA, setB,     LET(        cond, SCAN("",setA, LAMBDA(acc,a, SUM(--(setB = a)))),        inters, FILTER(setA, cond),        inters    ));

其中,最关键的就是第三行生成筛选条件。

我们的思路是循环setA,然后计算其中每一个元素 x 在setB中出现的次数。

只要 x 在setB中出现了,就表示这个元素需要出现在最后的交集中。

所以,我们的思路顺利成章,只要 x 在setB中出现,就表示这个元素不能出现在最后的差集中。

注意,这里很多人会犯一个错误,就是将第三行中的”=“改为"<>",

cond, SCAN("",setA, LAMBDA(acc,a, SUM(--(setB <> a)))),

乍看上去没什么问题,我就是统计一下那些没有在setB中出现的元素吧。

但是看一看例子,假设考虑setA的第一个元素“b",

比较setB <> "b",会得到数组,

TRUE

FALSE

FALSE

经过--处理后,变成数值数组:

1

0

0

SUM求和后,就会得到结果1,作为筛选条件,”a“将会出现在最后的差集中。

正确的做法

正确的方法是判断一下setB中等于元素 x 的个数是否等于0。因为只有等于0的才表示不在setB中出现,

cond, SCAN("",setA, LAMBDA(acc,a, SUM(--(setB = a)) = 0)),

于是,可以实现下面的自定义函数:

Difference = LAMBDA(setA, setB,     LET(        cond, SCAN("",setA, LAMBDA(acc,a, SUM(--(setB = a)) = 0)),        inters, FILTER(setA, cond),        inters    ))

使用方式如下:


详情咨询客服(底部菜单-知识库-客服)

Excel+Power Query+Power Pivot+Power BI


Power Excel 知识库    按照以下方式进入知识库学习
Excel函数   底部菜单:知识库->Excel函数

自定义函数  底部菜单:知识库->自定义函数

Excel如何做  底部菜单:知识库->Excel如何做

面授培训  底部菜单:培训学习->面授培训

Excel企业应用  底部菜单:企业应用

也可以在历史文章中学习Excel,Power Query,Power Pivot,Power BI,Power Automate各种技巧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章