Seleccione donde basado en columnas múltiples<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />No estoy seguro de si hay una buena manera de hacer lo que espero hacer, pero tengo la siguiente situación:
Tengo un archivo de datos que es el resultado de la recopilación de mediciones cada segundo. Hay una columna de marca de tiempo, una columna de estado y luego todas mis columnas de datos.
Hay tres entradas posibles diferentes en la columna de estado, "RAMP", "WAIT" y "READ". El orden general de los datos por tiempo da como resultado, por ejemplo, alrededor de 20 filas de "RAMP" seguidas de 85 filas de "WAIT" seguidas de 9 filas de "READ", que luego se repiten una docena de veces. Mis regiones de interés, que me gustaría seleccionar, son las últimas 30 filas dentro de cada sección etiquetadas como "ESPERAR".
Obviamente, es extremadamente sencillo seleccionar todas las filas "WAIT" o las últimas 30 filas del archivo completo, pero no puedo averiguar cómo seleccionar solo las últimas 30 de cada sección.
¿Hay una buena manera de resolver esto?
Re: Seleccione donde basado en columnas múltiplesCómo obtener el nombre de la tabla y el número de elementos de la lista:
dt = actual datable () ;
dt_name = dt << obtener nombre ;
primero = { "una" , "segundo" , "do" } ;
Nitems ( primero ) ;
Utilizar || para concatenar una cadena con otra:
"cuerda" || ( dt << obtener nombre )
Re: Seleccione donde basado en columnas múltiplesOtra función que * sé * debe existir pero simplemente no puedo encontrarla - la tabla de datos actual () devuelve una referencia que puedo asignar a dt, pero estoy buscando una forma de extraer el nombre de la tabla - tengo un script Me gustaría ejecutarme en muchas tablas diferentes, y quiero iniciarlo en la tabla actual y luego crear una nueva tabla de subconjuntos llamada " ". Esperaba que el nombre de la tabla de salida ("string" dt) o ("string" $ dt) funcionara, algo así, pero no lo hace. Estoy buscando documentación, pero pensé en lanzar este comentario por si acaso.
Re: Seleccione donde basado en columnas múltiplesEncontré una forma de hacer la lista que quería, añadí:
last_30_waits = {};
para (j = 1, j <= 3, j ++,
para (i = 0, i <= 3, i ++,
insertinto (last_30_waits, (wait_end_list- yo))));
dt << Seleccionar filas (last_30_waits);
Pero tengo la sensación de que no es óptimo. Además, ¿hay una función que devuelve el número de entradas en una lista? Me gustaría reemplazar el "3" en mi primer ciclo de bucle con esa función, pero tengo problemas para encontrarlo.
Re: Seleccione donde basado en columnas múltiplesGracias, eso me acerca mucho, pero tengo una pregunta más: ¿cuál es la mejor manera de seleccionar todo * entre * cada par de números de wait_start_list / wait_end_list? No he trabajado con listas antes. (Soy realmente nuevo en las secuencias de comandos en general, pero estoy tratando de aprender lo mejor que puedo).
Re: Seleccione donde basado en columnas múltiplesAquí hay una forma de hacerlo. Busca todas las filas WAIT y luego recorre los números de las filas. Cuando hay un espacio superior a 1, ha encontrado el final de una sección. El siguiente código crea dos listas que identifican los números de fila de inicio y final para cada sección. Creé una pequeña mesa para este ejemplo; cambiar el ntail parámetro a 30 para sus datos.
dt = Nueva mesa ( "temperatura" ,
Añadir filas ( 39 ) ,
Nueva Columna ( "Estado" ,
Personaje ,
Nominal ,
Establecer valores (
{ "RAMPA" , "RAMPA" , "RAMPA" , "ESPERE" , "ESPERE" , "ESPERE" , "ESPERE" , "ESPERE" , "LEER" ,
"LEER" , "LEER" , "LEER" , "LEER" , "RAMPA" , "RAMPA" , "RAMPA" , "ESPERE" , "ESPERE" ,
"ESPERE" , "ESPERE" , "ESPERE" , "LEER" , "LEER" , "LEER" , "LEER" , "LEER" , "RAMPA" ,
"RAMPA" , "RAMPA" , "ESPERE" , "ESPERE" , "ESPERE" , "ESPERE" , "ESPERE" , "LEER" , "LEER" ,
"LEER" , "LEER" , "LEER" }
)
) ,
) ;
wait_rows = dt << obtener filas donde ( : Estado == "ESPERE" ) ;
nr = las filas ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows El 1 ] - 1 ;
// Número de filas WAIT para obtener
ntail = 4 ;
// Esto obtendrá las últimas 4 filas WAIT. Reemplaza con 30 para obtener las últimas 30 filas WAIT
para ( yo = 1 , yo <= nr , yo ++,
new_row = wait_rows El yo ] ;
// Busque un espacio mayor que uno en la lista de filas
Si (( new_row - old_row ) > 1 ,
insertar en ( wait_start_list , ( old_row - ntail + 1 )) ;
insertar en ( wait_end_list , old_row ) ;
) ;
old_row = new_row ;
) ;
// Cuida el último conjunto de WAITs.
old_row = wait_rows El nr ] ;
insertar en ( wait_start_list , ( old_row - ntail + 1 )) ;
insertar en ( wait_end_list , old_row ) ;
Re: Seleccione donde basado en columnas múltiplesDesafortunadamente, actualmente solo soy JMP, no SAS básico, pero gracias por la sugerencia.
Re: Seleccione donde basado en columnas múltiplesUsted publicó esto en el foro de JMP, así que no estoy seguro de si esto ayuda o no. Usando la base SAS, es un programa relativamente corto si usa las herramientas correctas:
datos last_30_waits;
group_num + 1;
n_waits = 0;
do hasta (last.status y status = 'WAIT');
establecer mediciones (mantener = estado);
por estado no clasificado
si status = 'WAIT' entonces n_waits + 1;
fin;
** En este punto, group_num identifica un conjunto de WAIT, y n_waits muestra cuántos registros hay en el grupo;
n_found = 0;
do hasta (last.status y status = 'WAIT');
establecer mediciones;
por estado no clasificado
si status = 'WAIT' entonces hazlo;
n_found + 1;
si n_found> = n_waits - 29 entonces salida;
fin;
fin;
drop n_found;
correr;
Buena suerte.