Límite en la longitud de la cadena utilizada en el Resumen de la tabla y en Seleccionar filas duplicadasEste es un FYI, y quizás también una pregunta.
Un cliente preguntó hoy si había un límite en la longitud de la cadena utilizada para juzgar si las filas están duplicadas o al hacer un Resumen de tabla.Tenía cadenas de 8000 caracteres en una sola celda.(Estos eran datos de marcadores genéticos). Quería ver cuántos duplicados verdaderos tenía en una columna de datos.Tampoco informaron las filas correctas.Sospechaba un problema con la longitud de la cuerda.
Hice algunas comparaciones de fuerza bruta y descubrí que solo se comparan los primeros 2000 caracteres al hacer Resumen de tabla o Seleccionar filas duplicadas.
También encontré que hacer algo como "if (col1 == col2," Match "," No Match ") no tiene el límite de 2000 caracteres.(En otras palabras, la cadena completa (al menos hasta 8000 caracteres) parece usarse en la comparación).
No conozco otras funciones.
Entonces, esta es una comparación para tener cuidado con las cadenas largas ... y una pregunta: ¿Alguien sabe por qué limitamos a 2000 caracteres en estos casos?
Re: límite en la longitud de la cadena utilizada en el resumen de la tabla y en seleccionar filas duplicadasHola jerry,
Estoy especulando aquí, pero creo que lo que está haciendo su cliente con Resumen de tabla o Seleccionar filas duplicadas es inapropiado.¿Puede darnos más detalles? ¿Es un código genético que tiene 8000 caracteres y consta solo de A, C, G y Ts? Si es así, este sería un enfoque inapropiado.Parece que están tratando de colocar una clavija cuadrada en un agujero redondo.
Si realmente quieren usar JMP para esto, sería mejor hacer una sola columna de cada carácter y luego buscar duplicados entre filas.
Más importante es su objetivo. ¿Por qué buscan duplicados?
Re: límite en la longitud de la cadena utilizada en el resumen de la tabla y en seleccionar filas duplicadasInteresante. Parece que el cliente tiene razón.
dt1=New Table( "2000 characters",
Add Rows( 2 ),
New Column( "Column 1",
Character,
"Nominal",
Formula(
If( Row() == 1,
Repeat( "A", 1999 ) || "1",
Repeat( "A", 1999 ) || "2"
)
),
)
);
//this summary table will have two rows
dt1<< Summary(
Group( :Column 1 ),
Freq( "None" ),
Weight( "None" )
);
dt2=New Table( "2001 characters",
Add Rows( 2 ),
New Column( "Column 1",
Character,
"Nominal",
Formula(
If( Row() == 1,
Repeat( "A", 2000 ) || "1",
Repeat( "A", 2000 ) || "2"
)
),
)
);
//this summary table will have only one row
dt2<< Summary(
Group( :Column 1 ),
Freq( "None" ),
Weight( "None" )
);
yo apostaré @chungwei tendrá alguna idea.
Re: límite en la longitud de la cadena utilizada en el resumen de la tabla y en seleccionar filas duplicadas¡Seguro que Jerry!
Hay otras herramientas sencillas (como el código JSL que usó) que pueden analizar las picaduras largas para compararlas. De especial interés es que no solo los mismos caracteres en la cadena tienen la misma longitud, sino el orden en el que están. Verdaderos duplicados en el carácter y el orden de apariencia de esos personajes.
Sin embargo, si cada carácter (base / marcador en este caso) estuviera en su propia columna y luego todas esas columnas fueron seleccionadas para usarse para seleccionar filas duplicadas o el resumen de la tabla debería funcionar (pero puede ser lento).
Por lo general, este es un problema bioinformático y la gente puede escribir código para resolverlo.
Re: límite en la longitud de la cadena utilizada en el resumen de la tabla y en seleccionar filas duplicadasPor lo que vale, las fórmulas de columna parecen comparar cadenas al menos tan grandes como 8K caracteres.
El siguiente script identifica qué 27 de las 30 filas son duplicados de 3 cadenas de 8001 caracteres que difieren solo en el último carácter.
Names Default To Here(1);
a = repeat("0", 8000);
x = a ||"X";
y = a || "Y";
z = a || "Z";
vals = {x,y,z};
lis = {};
for(i=1, i<=30, i++,
insertinto(lis, eval(vals[randominteger(3)]));
);
dt = new table("xx", <<NEW column=""></NEW>