删除重复值(删除重复值所在的行)

“如何从数据中删除重复数据,只保留或提取非重复数据?我该怎么办?」本期采用三种方法来解决上述问题。手动重复数据删除提取一步完成独特的高级数组函数提取普通数组函数

“如何从数据中删除重复数据,只保留或提取非重复数据?我该怎么办?」

删除重复值(删除重复值所在的行)插图

本期采用三种方法来解决上述问题。

手动重复数据删除提取

一步完成独特的高级数组函数提取

普通数组函数选择(公式可以直接套用)

喜欢并根据自己的需求选择合适的方法。

问题:需求

例如下图的数据表,最下方存在两条重复数据,同时也存在一个客户有多笔订单的情况。比如下面的数据表,底部有两个重复的数据,也有一个客户有多个订单的情况。

有三个要求:

对数据进行去重,只保留不重复的数据;

去重后提取客户姓名;

提取只出现过一次的客户的名称;

1.该软件具有内置的重复数据删除操作。

将原始数据复制到新表中,并选择所有数据。

在数据选项卡上找到删除重复值按钮。

在弹出窗口中,如果数据有标题,记得检查标题。最下面三列的选项全部勾选,也就是说只有三列数据完全一致,才能认为是重复的。

点击确认删除,你会发现虽然有多个重名,但是所有重复数据的三列中只有一列被删除了。

如果要重复客户名称,可以“只检查客户名称”,最终结果如下图所示。

这时候的订单号和消费金额就没有意义了,可以删除。

如果要提取只出现过一次的客户名称,可以使用辅助列的方法。

在原始数据右侧增加一个辅助公式列,向下填充公式,统计名字个数。

=COUNTIF($B$2:$B$8,B2)

统计客户名称的出现次数后,过滤提取次数为1的数据。

提示:CTRL+SHIFT+L可以快速打开和关闭滤镜。

有了辅助列,就可以实现各种乱七八糟的去重操作,比如把& Link用成一个字符串,然后统计过滤去除重复。

不过,上面的方法,怎么看都感觉不够优雅!但是,上面的方法感觉不够优雅!

如果您的软件版本具有独特的功能,上述操作只需几行函数公式即可完成。

2 .独特的重复数据删除功能

微软365、Excel 2021以及最新版本的WPS都支持该功能。

UNIQUE函数用于返回列表或区域中的一系列唯一值。

参数如下:

=UNIQUE(数组,[按列],[恰好一次])

来自office支持来自办公室支持

总共有三个参数。通常情况下,不需要进行特殊设置。

例如,在要求1中,所有数据都按行进行重复数据消除。

如果您是Microsoft 365用户,请直接输入公式:

=UNIQUE(A1:C8)

回车就可以得到去重后的结果。您可以通过按回车键获得重量移除后的结果。

如果是WPS,需要按照普通数组公式使用方法。

首先选择承载已删除重复数据的空单元区域。

也就是细胞E1:G7。该选择范围根据重复数据删除后的数据大小来确定。可以比最终数据范围大,但不能小,否则会显示不完整的数据。

然后输入上面的公式。

最后按数组确认键CTRL+SHIFT+ Enter确认数组公式。

2需求要求提取重名,只需将函数的第一个参数数组,也就是要复制的数据区,缩小到名字区即可。公式如下:

=UNIQUE(B1:B8)

3需求要求提取只出现一次的客户名称,只出现一次的数据可以通过将unique函数的第三个参数改为1来提取。公式如下:

=UNIQUE(B1:B8,,1)

如果你的软件中没有unique功能,并且由于某种原因,你无法更新软件,你可以尝试下面的通用数组公式方法代替unique来实现一些相同的功能。

3.普通数组公式替换unique来复制单列数据。

例如,“客户名称”列数据已消除重复,完整的公式如下:

=INDEX($B$2:$B$8,SMALL(IF(MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1)),ROW(INDIRECT("1:"&COUNT(IF(MATCH($B$2:$B$8,$B$2:$B$8,0)+(ROW($B$2)-1)=ROW($B$2:$B$8),ROW($B$2:$B$8)-(ROW($B$2)-1)))))))

将公式中较低的数据替换为您自己的表中要进行重复数据消除的区域的实际地址。

$B:$B是要进行重复数据删除的区域中单元的参考地址;

$B是要进行重复数据删除的区域中“第一个单元”的参考地址;

请按照CSE数组公式输入的三个步骤(写在上面)来输入公式。

最终结果如图所示:

点击图片放大查看点击图片放大。

看到这么长的数组公式,不要慌。分析清楚结构后,可以直接替换其中的数据范围,写出适合自己数据的公式。

3.1通用数组函数公式分析

该公式的核心是通过索引函数,根据给定的位置数组,从给定的数据范围输出相应数据范围的数据。

"基本公式索引选择数据"

例如=index(B2:B8,{ 1;2;3})将返回B2:B8区的第1、2、3位数据。

现在最重要的是如何计算{ 1;2;3}这个位置数组,告诉index提取这三个位置的数据。

"匹配函数查找每个数据位置"

我们使用match函数来查找数据范围中指定数据的位置数据。即MATCH($ B $ 2:B $ 8,$ B $ 2:B $ 8,0),结果为{ 1;2;3;1;2;1;1}。

通过选择整个搜索区域来匹配整个搜索区域,我们可以得到每个客户的名字第一次出现在搜索区域中的时间。

从图中可以看出,有重复就有重复。

"使用if函数确定它是否第一次出现"

使用ROW($B:$B),我们可以得到每一行客户名称数据的位置数据,即{ 2;3;4;5;6;7;8}。

如果match函数找到的数据位置与row函数本身的数据位置一致,则说明这一行数据是第一次出现;否则说明之前已经出现过。

需要注意的是,由于客户的名字位于B2,row(B2)返回的值也是从2开始的。

match函数返回的位置数据是相对于搜索数据范围从1开始计数的,所以我们需要将这个相对位置差加到match函数中。

这种相对位置差的计算方法是从所选客户名称数据区域的第一个单元格位置$B中减去1,即行$ B $ 2-1。一定要加上$ absolute引用。

最后写出if函数的条件表达式:match ($ b : $ b ,$ b : $ b ,0)+(row ($ b )-1) = row ($ b : $ b )。

如果是真的,我们将返回相应数量的位置。可以写MATCH($ B $ 2:B $ 8,$ B $ 2:B $ 8,0)或者ROW($ B $ 2:B $ 8)-(ROW($ B $ 2)-1)。

如果不行,说明这个名字数据已经出现在你面前了,可以默认返回False。

完整if函数的公式如下:if (match ($ b : $ b ,$ b : $ b ,0)+(row ($ b )-1) = row ($ b : $ b ),row ($ b

此部分公式的计算结果为:{ 1;2;3;假的;假的;假的;FALSE}

"使用小函数依次选择最小的数字"

我们得到位置数组{ 1;2;3;假的;假的;假的;FALSE},现在只需使用小函数提取{ 1;2;3},整个公式完成。

小函数有两个参数,第一个是数组,第二个是要提取的最小值。

这里需要提取第1、2、3位的最小值,其中false不参与比较,第二个参数可以写成{ 1;2;3}数组,并一次性返回小函数提取的值。

公式如下:小({ 1;2;3;假的;假的;假的;FALSE}、{ 1;2;3})

问题的关键是如何生成{ 1;2;3}这种序列数组,刚好生成3个。

想知道,序列函数技巧,可以参考上一期序列算术序列函数这篇文章。

使用row(1:3),可以直接生成{ 1;2;3},但是如果从1到3行中的任何一行删除该表,该函数将报告一个错误。

所以我们可以使用indirect函数将原来的1:3行地址引用改为indirect(& quot;1:3 & quot;),这样外部操作就不会影响函数公式,而且最终公式是ROW(INDIRECT(& quot;1:3 & quot;))。

那么,如何指定要生成多少个呢?

我们可以用count函数统计前面if函数结果中的位数,就可以直接得到需要的数字。

所以,不要犹豫,直接复制if函数的公式部分,然后用count函数嵌套它并替换行(INDIRECT(& quot;1:3 & quot;))这里是3,注意文字和公式要用& Symbol拼接。

最后一个小功能的第二个参数,需求生成{ 1;2;3}的函数公式是ROW(INDIRECT(& quot;1:& quot;& ampCOUNT(IF(匹配($ B $ 2:B $ 8,$ B $ 2:B $ 8,0)+(行($B)-1)=行($ B $ 2:B $ 8),行($ B $ 2:B $ 8)-(行($ B $ 2)-1))))

虽然这部分这么长,但其实count函数里的公式之前都写过。最终公式烤成功:= index ($ b : $ b ,small (if (match ($ b : $ b ,$ b : $ b ,0)+(row($ b $ 2)-1)= row($ b 1:& quot;& ampCOUNT(IF(匹配($ B $ 2:B $ 8,$ B $ 2:B $ 8,0)+(行($B)-1)=行($ B $ 2:B $ 8),行($ B $ 2:B $ 8)-(行($ B $ 2)-1)))))

3.2那么,如何实现3的要求,只提取发生一次的数据呢?

函数公式如下:

=INDEX($B$2:$B$8,SMALL(IF(COUNTIF($B$2:$B$8,$B$2:$B$8)=1,ROW($B$2:$B$8)-(ROW($B$2)-1)),ROW(INDIRECT("1:"&COUNT(IF(COUNTIF($B$2:$B$8,$B$2:$B$8)=1,ROW($B$2:$B$8)-(ROW($B$2)-1)))))))

关键区别在于把match函数改成countif函数,从求位置数变成统计出现次数,判断出现次数是否等于1。

最后,如有相关问题,欢迎在评论区留言讨论。

你学会了吗?

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/169059.html

发表回复

登录后才能评论