你好,
有人能解释一下如何在一列中找到最长的重复模式吗?
例如,假设我有下表:

尺寸最大的模式是:“1 5 6 8 7”,它在此列中出现了 3 次。请注意,表中还有另一个模式(“1 5 6”),它出现了 5 次,但不是最大的。
我尝试使用“筛选 - 探索模式”,尽管它返回了重复次数最多的值,但我无法获得确切的模式。或者多个模式,以及出现的次数。
也许我应该启用一些选项?或者我应该使用其他平台?或者有人能帮我编写一个 JSL 脚本。
谢谢
你好@ruskicar ,
一种可能的选择是查看平台“探索模式”,如您所述,可通过分析、筛选、探索模式访问。
如果您单击平台窗口中“第 1 列”旁边的红色三角形,您可以选择“选择最长的重复序列”。 它将在您的数据表中突出显示 16 行,对应于序列“1 5 6 8 7 1 5 6”的 2 倍,这是您数据集中最长的重复序列,而不是“1 5 6 8 7”。
希望这个回答对你有帮助
@维克多_G完美的。
我写了这个 JSL,但对它提供的包含重叠重复项的答案不满意。
// build a sample table
dtElements = New Table( "elements", New Column( "element", Numeric, setvalues( J( 20, 1, Random Integer( 1, 3 ) ) ) ) );
nr = N Rows( dtElements );
// build key table
maxKeyLen = 12; // too big will be slow, too small will miss something
dtKeys = New Table( "keys", addrows( nr ), New Column( "key", expression, Set Display Width( 239 ) ) );
For( irow = 1, irow <= nr, irow += 1,
maxrow = Min( nr, irow + maxKeyLen );
dtKeys:key[irow] = dtElements:element[irow :: maxrow];
);
// sort key table to put similar together
dtKeys << Sort( By( :key ), Replace Table, Order( Ascending ) );
// get the match length of adjacent rows
// ===========================================
// this code finds two runs of 1,1,1 in 1,1,1,1 <<<<<<<<<< IMPORTANT <<<<<<<<<<<
// ===========================================
dtKeys << New Column( "matchLength" );
For( irow = 2, irow <= nr, irow += 1,
a = dtKeys:key[irow];
b = dtKeys:key[irow - 1];
result = Min( N Items( a ), N Items( b ) );
For Each( {{aa, bb}, i}, across( a, b, Count( "Shortest" ) ),
If( aa != bb,
result = i - 1;
Break();
)
);
dtKeys:matchLength[irow] = result;
);
dtKeys << Sort( By( :matchLength ), Replace Table, Order( Descending ) );
Show( dtKeys:key[1][1 :: dtKeys:matchLength[1]] );
JSL 使用表达式列 ForEach(Across, Count) 并处理数字和字符输入。 但我不认为它会做什么@ruskicar想要。
这个想法是创建一个新的值列,该值是从接下来的 N 行构建的。 对该列进行排序会将类似起始模式的运行放在相邻的位置。
是的,谢谢,这就是我要找的。 我看到这个例子有点糟糕,但答案是正确的:)。 红色三角形太多,所以我没有发现那个选项
。