Encuentra el patrón repetitivo más largoHola,
¿Alguien puede explicar cómo encontrar el patrón repetido más largo en una columna?
Por ejemplo, supongamos que tengo la siguiente tabla:

El patrón con el tamaño más grande es: "1 5 6 8 7" y aparece 3 veces en esta columna. Observe que hay otro patrón en la tabla ("1 5 6"), que ocurre 5 veces, pero no es el más grande.
Intenté con Detección - Explorar patrones y, aunque devuelve qué valores están más duplicados, no puedo obtener el patrón exacto. O múltiples patrones, con el número de ocurrencias.
¿Quizás hay alguna opción que debería habilitar? ¿O debería usar alguna otra plataforma? O si alguien puede ayudarme con un script JSL.
Gracias
Automatización y secuencias de comandosLa personalización en masaRe: Encuentra el patrón repetitivo más largoHola @ruskicar ,
Una posible opción es buscar en la plataforma "Explorar patrón", accesible a través de Analizar, Proyectar, Explorar patrón como mencionas.
Si hace clic en el triángulo rojo junto a "Columna 1" en la ventana de la plataforma, tiene la opción de "Seleccionar las secuencias duplicadas más largas". Resaltará en su tabla de datos 16 filas, correspondientes a 2 veces la secuencia "1 5 6 8 7 1 5 6", que es la secuencia repetitiva más larga que tiene en su conjunto de datos, no "1 5 6 8 7".
Espero que esta respuesta te ayude,
Re: Encuentra el patrón repetitivo más largo@Victor_G perfecto.
Escribí este JSL y no estaba satisfecho con la respuesta que proporciona que incluye duplicados superpuestos.
// 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]] );
El JSL usa una columna de Expresión, ForEach( Across, Count ) y maneja la entrada tanto numérica como de caracteres. Pero no creo que haga lo que @ruskicar quiere.
La idea es crear una nueva columna de valores construida a partir de las siguientes N filas. Ordenar esa columna coloca secuencias de patrones de inicio similares adyacentes.
Re: Encuentra el patrón repetitivo más largoSí, gracias, esto es lo que estaba buscando. El ejemplo fue un poco pésimo por lo que veo, pero la respuesta es correcta
. Demasiados triángulos rojos, así que no vi esa opción
.