¿Cuál es la forma más rápida de completar una nueva columna con valores de caracteres?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola, tengo un script que realiza una concatenación avanzada de tablas y quiero agregar 'columnas de origen' para indicar los nombres de las tablas originales. Tengo algunos métodos que funcionan pero todos son lentos para tablas grandes. También probé un método de fórmula pero tampoco fue rápido. ¿Hay algún otro truco que pueda usar?
El siguiente ejemplo coincide mucho con lo que estoy haciendo. Los tamaños de tablas de datos de 1 millón de filas no son inusuales, por lo que realmente me gustaría reducir esta operación a segundos bajos para tablas grandes.
Gracias,
Miguel
dt = nueva mesa () ;
listadt = { dt } ;
número de filas = 50000 ;
dt << agregar filas ( número de filas ) ;
tiempo2 = hoy () ;
si ( 0 ,
dt << nueva columna ( "prueba" , personaje , establecer cada valor ( evaluar ( listadt [ 1 ]) << obtener nombre )) ; // 24 segundos a 50k filas.
,
listatemp = {} ;
para ( i = 1 , i <= número de filas , i ++, listatemp [ i ] = evaluar ( listadt [ 1 ]) << obtener nombre ) ; //104 segundos a 50.000 filas.
dt << nueva columna ( "prueba" , personaje , valores ( templista )) ;
) ;
espectáculo ( evaluar ( hoy () - tiempo2 )) ;
Re: ¿Cuál es la forma más rápida de completar una nueva columna con valores de caracteres?Hay una manera más fácil que mi primer ejemplo, al menos para este caso.
inicio = marcar segundos();
dt = Nueva tabla();
dt << Nueva columna( "prueba", Carácter, "Nominal", Fórmula( Evaluación (dt << obtener nombre) ) );
dt << addrows (1e7);
dt << ejecutar fórmulas;
detener = marcar segundos();
Mostrar( detener - iniciar );
El argumento Fórmula del mensaje NewColumn a una tabla de datos se diseñó originalmente para que fuera muy fácil de usar en los casos comunes, algo así como
Fórmula (altura + peso)
donde la altura y el peso son columnas de la tabla de datos y la suma debe realizarse en cada fila.Por lo tanto, Fórmula no evalúa su argumento, sino que simplemente almacena la expresión no evaluada como la fórmula de la columna.
A menos que... la función externa sea Evaluación(...) que ves en el ejemplo más fácil de arriba.Cuando se procesa el argumento fórmula(...), busca Eval y utiliza el resultado evaluado.Hay otros lugares en JMP que también hacen esto.Y hay otros lugares, como la función sustituta, que usan Expr(...) para evitar una evaluación de los argumentos de expresión.
Re: ¿Cuál es la forma más rápida de completar una nueva columna con valores de caracteres?Gracias Craige. Después de publicar mi mensaje original, se me ocurrió que la función de tablas concatenar() nativa de JMP tiene la opción 'crear columna de origen', y pude encontrar el código usando la función de concatenar estándar y luego hacer clic en el triángulo rojo. / script fuente para ver cómo funcionó. Esta opción no parece estar documentada en ninguna parte.Mi script funciona con dos copias de las tablas originales, por lo que esta solución intermedia requirió una pequeña manipulación para volver a los nombres de las tablas originales.Si hubieran sido las tablas originales, esta habría sido una buena solución.
Su método es bastante limpio y ciertamente rápido. La necesidad de algo como esto surge con bastante frecuencia, así que lo marcaré como favorito. Creo que es hora de que aprenda el valor de esas combinaciones de funciones. Los he visto usados, los he usado cuando me dijeron que era cómo hacer que algo funcionara correctamente, pero rara vez parece poder reconocer cuándo usarlo. Esta vez estuve cerca... Pensé que la fórmula funcionaba (mencionada en OP), pero al mirar el código recuerdo que no funcionó porque la expresión simplemente apareció en la fórmula. Pensé que necesitaría algo como esto pero no estaba seguro de cómo hacerlo.
¿Existe alguna regla general sobre qué tipos de funciones pueden o deben incluirse en expresiones para optimizar mis scripts? ¿O recomendaría simplemente ejecutarlo y hacer un análisis de tiempo y arreglar lo que es lento, que es lo que hago?
Gracias de nuevo,
Miguel
PD: gracias por recordarme los segundos de tick(). Sabía que había una función mejor que hoy() para eso.
Re: ¿Cuál es la forma más rápida de completar una nueva columna con valores de caracteres?inicio = marcar segundos();
dt = Nueva tabla();
evaluar(
Expr evaluación(
dt << Nueva columna( "prueba",
Personaje,
"Nominal",
Fórmula ( Expr ( dt << obtener nombre ) )
)
)
);
dt << addrows (1e7);
dt << ejecutar fórmulas;
detener = marcar segundos();
Mostrar( detener - iniciar );
detener - iniciar = 3.80000000004657; // 10.000.000 filas en 4 segundos
El patrón eval( evalExpr(... expr(... ) ... )) es una forma de manipular una expresión en JMP.Para entenderlo, comience con EvalExpr(...) que analiza su argumento para encontrar cualquier Expr(...). las partes Expr se evalúan y el resultado (una cadena en este caso) se deja en lugar de Expr.El resultado de EvalExpr es una expresión que debe ser evaluada por el eval(...) externo.
Puede que haya una forma más rápida; No exploré muy lejos.
