计算单个单元格中特定单词的频率

时间:2015-07-29 16:08:53

标签: excel count excel-formula

在Microsoft Excel中,我希望计算单元格中特定单词的频率。单元格包含几个句子。我正在使用一个正在运行的公式,但不是我想要的方式。

A1

my uncle ate potatos. potato was his favorite food. Don't mash the potato, just keep it simple.

B1 (计算频率的字)

potato

C1 (论坛)

=(LEN(A2)-LEN(SUBSTITUTE(A2;B2;"")))/LEN(B2)

C1结果:

3

在C1中,我得到一个计数3.我希望它只是2.所以,公式计算potatos

如何使该功能仅计算完全匹配?

5 个答案:

答案 0 :(得分:3)

我在这里得到了一个解决方案,但它并不漂亮。

正如我在评论中指出的那样,问题在于Excel没有内部功能来查看单元格是否包含完全匹配'。您可以检查单元格中的总值是否完全匹配,但是您无法检查搜索词是否已经像这样共轭。因此,我们需要创建一种特殊的方法来检查每个可接受的'结束一个词。在我看来,这将是任何以空间结束的东西,任何以标点符号结尾的东西,以及在单元格末尾没有任何内容的任何东西。

ARRAY FORMULAS

你使用LEN - SUBSTITUTE方法走在正确的轨道上,但公式需要是一个数组公式才能工作。数组公式在给定的单元格范围内多次计算相同的事物,而不是仅一次。它们解析公式中每个单元格的计算并提供一系列结果。必须将此结果数组折叠在一起才能获得单个总结果。

考虑如下:

=LEN(C1:C6)

使用CTRL + SHIFT + ENTER而不是ENTER确认此公式。这给了我们C1的LEN,然后是C2,C3 ......等,得到了一个看起来像这样的结果数组[假设C1有&#34; a&#34;,C2有&#34; aa&# 34;,C3有&#34; a&#34;,C4有&#34;&#34;,C5有&#34; aaa&#34;,C6有&#34;&#34;]:< / p>

={1;2;1;0;3;0}

要将其作为单个数字单独提供每个单元格的总长度,请将其包装在SUM函数中:     = SUM(LEN(C1:C6))

再次使用CTRL + SHIFT + ENTER确认,而不仅仅是ENTER。这导致所有细胞的总长度:7。

定义一个精确的匹配

现在提出您的问题,您希望找到所有可接受的&#39;文本A1中给定单词B1的匹配。正如我之前所说,我们可以将可接受的答案定义为以标点符号,空格或单元格结尾结束的答案。细胞末端的东西是一个特殊情况,我们稍后会考虑。首先,看看下面的公式。在单元格C1:C6中,我手动输入了一个逗号,一个句点,一个分号;连字符,空格和斜线。这些将是可接受的&#39;结束B1中找到的单词的方法。

=LEN(SUBSTITUTE(A1,B1&C1:C6,""))

使用CTRL + SHIFT + ENTER确认,这将取代B1 中的搜索项替换长度 C1:C6中可接受的字端。因此它给出了6个新的替换单词的长度。但由于这是一系列结果,我们需要将它们组合在一起以获得单个数字,如下所示:

=SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))

制定结果

要像在句子中那样使用它,我们现在需要从原始单词的长度中减去这个长度。请注意,这样做很简单 - 因为我们要多次搜索,我们需要多次添加原始单词的长度。考虑这样的事情:

=LEN(A1)-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))

这不会起作用,因为它只增加了A1的长度一次,但它多次减去替换字符串的长度。怎么样?

=LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))

这是有效的,因为我们用C1:C6搜索了6个单词结尾项,所以那里的替换将发生6次。因此,我们将单词的原始长度设置为6次,每个替换单词的长度为6次[请记住,如果没有匹配,比如说,&#34;马铃薯;&#34;,则该术语将给出原始单词的长度,从而否定我们添加单词长度的一次,如预期的那样。

要完成此操作,我们需要除以搜索字词中的字母数。请记住,在你拥有&#34; / LEN(B1)&#34;的地方,我们需要为每个词尾的长度添加一个字符。

=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1)

最后,我们需要添加特殊情况,其中A1的最后部分等于搜索词,没有词尾。独自一人,这将是:

=IF(RIGHT(A1,LEN(B1))=B1,1,0)

如果A1的最后一部分等于B1,这将给我们1,否则它给出0.所以现在只需将它添加到我们之前的公式中,如下所示:

=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0)

请记住使用CTRL + SHIFT + ENTER确认,而不是仅使用ENTER。就是这样,它现在可以为您提供所有&#34;完全匹配的数量&#34;你的搜索字词。

对阵列公式的替代方法

请注意,您可以改为使用C1:C6代替硬编码,以查找特定标点符号作为单词结尾。这将更难维护,但在我看来,同样可读。它看起来像这样:

=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&{",",".",";"," ","/","-"},""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0)

这在技术上仍然是一个&#34;数组公式&#34;,它的工作原理与我上面描述的相同。但是,这里的一个好处是您可以使用ENTER确认此类型的条目。这很好,万一有人意外地编辑你的单元格并按下ENTER而没有注意到。否则,这与上述格式不同。

如果您希望详细阐述其中的任何部分,请与我们联系。

答案 1 :(得分:2)

我确实有一个替代解决方案供您考虑。我需要更多的空间,公式有点复杂,但从某种意义上说它会更简单。

将列C用作新的帮助程序列。 C列将从A列中获取文本,并用“”替换所有标点符号实例。完成此操作后,从B列开始计算搜索词实例的公式将是一个简单的公式,基本上就像您在OP中一样。

 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," ")

此公式首先将所有斜杠替换为空格,然后使用该替换文本将短划线替换为空格,然后使用该替换文本将分号替换为空格等。如您所示,如果使用分号作为分隔符,则将需要替换用逗号分隔术语的逗号。

然后,D1中的公式就是您在OP中的上述公式,有两处变化:我们将搜索B1&amp; “”,因为我们知道所有'完全匹配'现在以空格结尾,如果C1中文本的最后部分与B1中的搜索项相同,我们将添加额外的'1' - 因为如果一个单元格以该单词结尾,它没有空格,但它仍然是“完全匹配”。像这样:

=(LEN(C1)-LEN(SUBSTITUTE(C1,B1&" ","")))/(LEN(B1)+1)+IF(RIGHT(C1,LEN(B1))=B1,1,0)

修改

我的标点符号列表只是一个建议;我建议你真正浏览一些示例文本,并确保在单词之后没有任何奇怪的字符。另外,考虑用“?”改变我不常见的(如“/”或“ - ”)。要么 ”!”。如果您想添加更多,请按照SUBSTITUTE公式的模式。

要使此不区分大小写,您只需更改C列中的公式以使结果全部为小写,然后确保B列中的搜索项为小写。像这样更改C列:

 =LOWER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," "))

答案 2 :(得分:1)

很抱歉使它成为“新答案”。您可以随时移动它。

我刚刚找到了答案的解决方案。刘康在2015年8月3日12:15提出。 :) 不幸的是,对于上面的 Eh'Bacon级的解决方案,我没有“ 50信誉”来评论,最后的评论是:

  

发现了一个小问题。将=IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;B1&" ";"")))/(LEN(B1)+1)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")与B1中的鞋子一起使用会得到以下结果:A1 = 1(正确)的鞋子,A1 = 0(正确)的鞋子,A1 = 1(错误)的淑女鞋。猜猜这与公式中的“ RIGHT”有关。是否可以使公式与前缀词不匹配?例如,如果B1包含鞋子,而A1包含淑女鞋,则我希望C1的结果为0。– Liu Kang 15年8月3日,12:15

解决方案是在单词的开头也搜索一个空格(”“&B1&”“ ),并再添加一个“ LEN(B1)+2 < / strong>。因此,它变为=IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;" "&B1&" ";"")))/(LEN(B1)+2)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")

如果我们要寻找的单词开头是一个问题。因为句子开头显然没有空格 " "。我为此使用了一种解决方法-我的句子在A1中,但是我有一个隐藏的列B,其中B1中有=" "&A1,它将所需的“空格”放在句子的开头,以及从原来的“ Eh”级培根解决方案已转移(A1-> B1,B1-> C1,C1-> D1)。

我希望它能对您有所帮助。 :)

感谢所有参与此主题的人,您帮了我很多忙!

Aleš

答案 3 :(得分:0)

您需要将其作为单一配方吗?我有一个想法,但它需要一些(相对简单的)步骤。

由于你在A1中有一个长句,那么去数据怎么样 - &gt;文本到列,并将此句子发送到一行,由空格分隔。然后,删除任何标点符号。那么,只需做一个简单的Countif()

将信息放入A1,然后转到数据 - &gt;将文字添加到列中,选择&#34;分隔&#34;,单击下一步,然后选择&#34;空格&#34;:

enter image description here

单击“完成”,它将整个事物放入第1行,每个单元格中都有一个单词。现在只需查找/替换&#34;。&#34;和&#34;,&#34;什么都没有。

然后,Countif来救援!

enter image description here

如果可行,我们可以自动进入VB,因此您不必手动查找/替换puncutation。在我进入之前,这种方法有用吗?

答案 4 :(得分:-1)

获取字符串的长度并减去字符串的长度,并将关键字替换为nothing,然后将结果除以关键字的长度:

=(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)