我有一个50 k + URL的列表,并在这些URL中寻找最常见的3/4/5/6个字母(barring.com/.org/etc)。因此,如果URL是strings.com和string2.com,它会告诉我string是最常见的字母序列。有办法做到这一点吗?我试过=INDEX(range, MODE(MATCH(range, range, 0 ))),但不起作用。
strings.com
string2.com
string
=INDEX(range, MODE(MATCH(range, range, 0 )))
jyztefdp1#
以下代码将溢出所有可能的连续3-6个字符的子字符串及其计数(按其各自的计数顺序):
C2中的公式:
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)))
mgdq6dx12#
我不确定是否完全理解这个问题。我假设您希望找到不同大小(6/5/4/3)的集合中出现频率最高的子字符串。假设您的数据位于A列。您希望了解列表中所有可能大小的最常见子字符串。在单元格C1中,我们生成预期大小:
A
C1
=SEQUENCE(1,4,6,-1)
如果你想在颠倒其他,那么:SEQUENCE(1,4,3,1)现在,我们将根据每个长度,从A列中查找该长度内最频繁的模式。在单元格C2中,我们将使用以下公式:
SEQUENCE(1,4,3,1)
=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,如下所示:
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:
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:
strings
LEFT
substr
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的方法:
XMATCH(lookup_value, lookup_array)
lookup_value
lookup_array
matchUX
FREQUENCY
DROP
freq
maxFreq
FILTER
matchIdx
FILTER(matchUX, ISNUMBER(XMATCH(freq, maxFreq)))
然后,名称matchIdx,具有来自match名称的所有索引,对应于最大频率。我们现在需要找到对应的substr值。名称match和substr具有相同的大小。因此,我们可以再次使用FILTER来使用XMATCH函数通过matchIdx找到这样的substr值:
XMATCH
FILTER(substr, ISNUMBER(XMATCH(match, matchIdx)))
最后,我们使用UNIQUE,以防同一个子串达到最大频率,因此我们只对唯一的子串感兴趣。
UNIQUE
2条答案
按热度按时间jyztefdp1#
以下代码将溢出所有可能的连续3-6个字符的子字符串及其计数(按其各自的计数顺序):
C2
中的公式:mgdq6dx12#
我不确定是否完全理解这个问题。我假设您希望找到不同大小(6/5/4/3)的集合中出现频率最高的子字符串。假设您的数据位于
A
列。您希望了解列表中所有可能大小的最常见子字符串。在单元格
C1
中,我们生成预期大小:如果你想在颠倒其他,那么:
SEQUENCE(1,4,3,1)
现在,我们将根据每个长度,从
A
列中查找该长度内最频繁的模式。在单元格
C2
中,我们将使用以下公式:然后向右扩展,以考虑每列的不同长度。
如果您希望得到结果而不向右扩展,则可以使用以下方法,通过以下备选方法之一,在一个公式中得到整个结果:
备选方案1:使用
DROP/REDUCE/HSTACK
,如下所示:备选方案2:使用
TEXTSPLIT/TEXTJOIN
:注:在这两种替代方案中,都不需要使用
$
-表示法。以下是预期输出:
可以有多个子字符串具有最高频率,因此它可以返回数组而不是单个值。在上一个示例中,输出只是单个值,但公式假定多个子字符串可以具有最高频率。
说明
在每次迭代(每列)中,我们从名称
strings
中选择相应的子字符串(基于最大长度)。我们使用LEFT
函数。因为
substr
name是一个数组(而不是一个范围,所以我们不能使用COUNTIF*
家族中的任何函数),所以我们将使用XMATCH/FREQUENCY
,因为两者都接受数组。名称
match
:通过以下方式帮助查找计数:
XMATCH(lookup_value, lookup_array)
每次在lookup_value
中找到lookup_array
值时,它都会将相同的索引位置放置在其中。现在有了唯一的匹配数(
matchUX
),我们就可以通过FREQUENCY
进行计数了。我们不需要最后打开的箱子(检查这个函数的documentation),所以我们通过DROP
函数删除最后一行。现在我们有了频率(
freq
),我们需要找到最大频率。(matchUX
)。因此,我们对matchUX
中具有最大频率的所有值感兴趣(maxFreq
)。我们使用FILTER
函数来实现。我们可以有多个过滤结果,即两个子字符串具有最大频率的情况。下面是我们计算名称matchIdx
的方法:然后,名称
matchIdx
,具有来自match
名称的所有索引,对应于最大频率。我们现在需要找到对应的substr
值。名称match
和substr
具有相同的大小。因此,我们可以再次使用FILTER
来使用XMATCH
函数通过matchIdx
找到这样的substr
值:最后,我们使用
UNIQUE
,以防同一个子串达到最大频率,因此我们只对唯一的子串感兴趣。