如何在Excel文件中搜索最常见的6个字母的序列?

3wabscal  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(167)

我有一个50 k + URL的列表,并在这些URL中寻找最常见的3/4/5/6个字母(barring.com/.org/etc)。
因此,如果URL是strings.comstring2.com,它会告诉我string是最常见的字母序列。
有办法做到这一点吗?
我试过=INDEX(range, MODE(MATCH(range, range, 0 ))),但不起作用。

jyztefdp

jyztefdp1#

以下代码将溢出所有可能的连续3-6个字符的子字符串及其计数(按其各自的计数顺序):

C2中的公式:

=LET(x,TOCOL(DROP(REDUCE(0,SEQUENCE(4,,3),LAMBDA(a,b,HSTACK(a,LET(c,REDUCE(0,A1:A3,LAMBDA(d,e,VSTACK(d,LET(f,MID(e,SEQUENCE(LEN(e)-b+1),b),f)))),c)))),1),2),y,UNIQUE(x),UNIQUE(SORT(HSTACK(y,MAP(y,LAMBDA(z,SUM(--(x=z))))),2,-1)))
mgdq6dx1

mgdq6dx12#

我不确定是否完全理解这个问题。我假设您希望找到不同大小(6/5/4/3)的集合中出现频率最高的子字符串。假设您的数据位于A列。您希望了解列表中所有可能大小的最常见子字符串。
在单元格C1中,我们生成预期大小:

=SEQUENCE(1,4,6,-1)

如果你想在颠倒其他,那么:SEQUENCE(1,4,3,1)
现在,我们将根据每个长度,从A列中查找该长度内最频繁的模式。
在单元格C2中,我们将使用以下公式:

=LET(maxLength, C1, strings, $A$2:$A$13, substr, LEFT(strings, maxLength),
  match, XMATCH(substr, UNIQUE(substr)),
  matchUX, UNIQUE(match), freq, DROP(FREQUENCY(match, matchUX), -1),
  maxFreq, MAX(freq), matchIdx, FILTER(matchUX, ISNUMBER(XMATCH(freq, maxFreq))),
  UNIQUE(FILTER(substr, ISNUMBER(XMATCH(match, matchIdx))))
)

然后向右扩展,以考虑每列的不同长度。
如果您希望得到结果而不向右扩展,则可以使用以下方法,通过以下备选方法之一,在一个公式中得到整个结果:

备选方案1:使用DROP/REDUCE/HSTACK,如下所示:

=LET(maxLengths, C1:F1, strings, A2:A13,
 DROP(REDUCE(0, maxLengths, LAMBDA(acc,length, HSTACK(acc, LET(
  substr, LEFT(strings, length), match, XMATCH(substr, UNIQUE(substr)),
  matchUX, UNIQUE(match), freq, DROP(FREQUENCY(match, matchUX), -1),
  maxFreq, MAX(freq), matchIdx, FILTER(matchUX, ISNUMBER(XMATCH(freq, maxFreq))),
  UNIQUE(FILTER(substr, ISNUMBER(XMATCH(match, matchIdx))))
  )))),,1)
)

备选方案2:使用TEXTSPLIT/TEXTJOIN

=LET(maxLengths, C1:F1, strings, A2:A13,
  bc, BYCOL(maxLengths, LAMBDA(length, LET(
    substr, LEFT(strings, length), match, XMATCH(substr, UNIQUE(substr)),
    matchUX, UNIQUE(match), freq, DROP(FREQUENCY(match, matchUX), -1),
    maxFreq, MAX(freq), matchIdx, FILTER(matchUX, ISNUMBER(XMATCH(freq, maxFreq))),
    TEXTJOIN(";",,UNIQUE(FILTER(substr, ISNUMBER(XMATCH(match, matchIdx)))))
  ))), TRANSPOSE(TEXTSPLIT(TEXTJOIN(",",, bc), ";", ","))
)

:在这两种替代方案中,都不需要使用$-表示法。

以下是预期输出:

可以有多个子字符串具有最高频率,因此它可以返回数组而不是单个值。在上一个示例中,输出只是单个值,但公式假定多个子字符串可以具有最高频率。

说明

在每次迭代(每列)中,我们从名称strings中选择相应的子字符串(基于最大长度)。我们使用LEFT函数。
因为substr name是一个数组(而不是一个范围,所以我们不能使用COUNTIF*家族中的任何函数),所以我们将使用XMATCH/FREQUENCY,因为两者都接受数组。
名称match

XMATCH(substr, UNIQUE(substr))

通过以下方式帮助查找计数:XMATCH(lookup_value, lookup_array)每次在lookup_value中找到lookup_array值时,它都会将相同的索引位置放置在其中。
现在有了唯一的匹配数(matchUX),我们就可以通过FREQUENCY进行计数了。我们不需要最后打开的箱子(检查这个函数的documentation),所以我们通过DROP函数删除最后一行。
现在我们有了频率(freq),我们需要找到最大频率。(matchUX)。因此,我们对matchUX中具有最大频率的所有值感兴趣(maxFreq)。我们使用FILTER函数来实现。我们可以有多个过滤结果,即两个子字符串具有最大频率的情况。下面是我们计算名称matchIdx的方法:

FILTER(matchUX, ISNUMBER(XMATCH(freq, maxFreq)))

然后,名称matchIdx,具有来自match名称的所有索引,对应于最大频率。我们现在需要找到对应的substr值。名称matchsubstr具有相同的大小。因此,我们可以再次使用FILTER来使用XMATCH函数通过matchIdx找到这样的substr值:

FILTER(substr, ISNUMBER(XMATCH(match, matchIdx)))

最后,我们使用UNIQUE,以防同一个子串达到最大频率,因此我们只对唯一的子串感兴趣。

相关问题