Usar si entonces en matriz<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola amigos,
Tengo algunos datos del instrumento que periódicamente exhiben grandes cambios en los datos debido al reajuste del instrumento. Estoy tratando de crear una nueva variable que haga lo siguiente: Si (datos - datos [i-1]> 4) o (datos - datos [i-1] <-4), entonces adj_data = adj_data [i-1], Else, datos = adj_data + (datos - datos [i-1]); Básicamente, si el valor de datos actual excede el valor anterior en 4 o -4, entonces haga que el nuevo valor ajustado sea igual al valor ajustado anterior, Si no, agregue la diferencia entre el valor de datos actual y anterior al valor ajustado.
Descubrí cómo leer los datos en una matriz y eliminar los datos faltantes, pero no estoy seguro de cómo completar los cálculos descritos anteriormente en la matriz. Cualquier sugerencia sobre cómo lograr esto sería apreciada.
Borrar registro();
Nombres predeterminados hasta aquí (1);
dt = Nueva tabla ("Ajustar para datos faltantes",
Añadir filas (24),
Comprimir el archivo cuando se guarda (1),
Nueva columna ("Fecha",
Numérico,
Continuo,
Formato ("m / d / y", 19),
Formato de entrada ("m / d / y"),
Establecer valores (
[3447619200, 3447705600, 3447792000, 3447878400, 3447964800,
3448051200, 3448137600, 3448224000, 3448310400, 3448396800,
3448483200, 3448569600, 3448656000, 3448742400, 3448828800,
3448915200, 3449001600, 3449088000, 3449174400, 3449260800,
3449347200, 3449433600, 3449520000, 3449606400]
)
)
Nueva columna ("Data1",
Numérico,
Continuo,
Formato ("Mejor", 12),
Establecer valores (
[11, 13, 50, 15,., 17, 18, -20, 20,., 21, 22,., 24, 25, 23,.,.,
.,., 25, 26, 27, 28]
)
)
Nueva columna ("Adj Data1",
Numérico,
Continuo,
Formato ("Mejor", 12),
Establecer valores (
[0, 2,., 4,., 6, 7,., 9,., 10, 11,., 13, 14, 12,.,.,.,., 14,
15, 16, 17]
)
)
);
// Poner los datos relevantes en la matriz.
date_time =: Nombre ("Fecha") << Obtener valores;
datos =: Nombre ("Datos1") << Obtener valores;
// Determine las filas que solo incluyen datos que no faltan
row_list = dt << obtener filas donde (
Y(
! Está faltando (: Data1),
Contiene (datos,: Datos1),
Contiene (datos,: Datos1) == Contiene (fecha_tiempo, Formato (: Fecha, "mdy"))
)
);
// Convierte row_list, actualmente una matriz [], a una lista {}
Es Lista (row_list = Como Lista (row_list));
date_time = date_time [Loc (! Faltan (datos))];
datos = datos [Loc (! Falta (datos))];
Re: Usa Si Entonces En MatrizLo siento, Jeff, no tenía más claridad sobre lo que estoy tratando de lograr. Puede que haya confundido las cosas al hablar tanto del código JSL como de las fórmulas de columna.
El archivo de datos adjunto muestra el resultado "deseado" en: adj_data1 y el resultado de la fórmula de columna que proporcionó en Nueva información adj. Tenga en cuenta que la columna New Adj Data inserta el valor de New Adj Data anterior cuando falta: data1, aunque el objetivo es que New Adj Data muestre datos faltantes cuando falta data1.
Para crear la columna: adj_data1, estaba tratando de adaptar su fórmula de columna para que:
- Cuando falta: data1, el valor de New Adj Data anterior se coloca en una variable local y se transfiere hasta que sea necesario en el paso 2
- Si el valor actual: data1 no falta y el valor anterior: data1 falta, entonces New Adj Data se establece en la lista de valores actuales en la variable local.
El punto en el que me estoy quedando colgado es agregar el nuevo valor de datos adjuntos en el paso 1 a una variable local y luego recuperar / usar ese valor para el paso 2.
Tal vez lo estoy haciendo más complicado de lo que debería ser, y tienes una manera fácil de lograrlo. Sin duda agradecería cualquier ayuda que pueda proporcionar. Si su solución no usa una variable local en la fórmula de la columna, también le agradecería si pudiera proporcionar un ejemplo simple de cómo usar una variable local como la que he descrito anteriormente, o señalarme un conjunto de datos JMP existente que Utiliza variables locales en la fórmula de la columna. Parece que ser capaz de usar con éxito variables locales en fórmulas de columna sería muy útil. Gracias de nuevo.
Re: Usa Si Entonces En Matriz¿Tiene alguna orientación sobre cómo puedo lograr el siguiente código JSL utilizando variables locales en una fórmula de columna?
Si está definiendo variables en un programa JSL y desea usarlas en una fórmula de columna, deben ser variables globales. Prefije las variables con "::" y puede usarlas en una fórmula de columna. Por ejemplo :: g_one_variable
Re: Usa Si Entonces En MatrizHola Terapin,
Me temo que me está costando mucho descifrar lo que está buscando hacer en función de la JSL que envió.
La tabla de datos que adjunté anteriormente trata los valores faltantes en data1 sin la necesidad de una variable local en la fórmula. Comprueba si falta Data1 en la fila actual o en la fila anterior con la falta! (Falta) (: Data1 - Lag (: Data1,1)). Si falta alguno, la diferencia también faltará.
Aquí está la fórmula en la columna New Adj Data:
Si(
Fila () == 1, 0,
Abs (: Data1 - Lag (: Data1, 1))> 4 | Falta (: Data1 - Lag (: Data1, 1)), Lag (: New Adj Data, 1),
Lag (: New Adj Data, 1) + (: Data1 - Lag (: Data1, 1))
)
Si esto no es lo que necesita, ¿puede publicar una tabla de datos de muestra junto con una explicación de exactamente qué le gustaría que estuviera el valor de esta nueva columna basada en fórmula en cada fila? Eso me ayudará a entender exactamente lo que estás buscando.
¡Gracias!
-Jeff
Re: Usa Si Entonces En MatrizGracias Jeff por proporcionar un ejemplo de una fórmula de columna, así como los ejemplos de matriz. Como puede imaginar, mi caso es un poco más complicado y requiere que me salte las filas donde faltan los datos, pero que transfiera el valor de datos ajustado anterior. Puedo lograr esto con el siguiente código JSL, pero no puedo entender cómo usar las variables locales en una fórmula de columna. ¿Tiene alguna orientación sobre cómo puedo lograr el siguiente código JSL utilizando variables locales en una fórmula de columna? Gracias.
Borrar registro();
lag_adj_data = 0;
: adj_data1 [1] = 0;
Para (i = 2, i <= N filas (dt1), i ++,
Si (Abs (: data1 -: data1 [i - 1])> 4,
: adj_data1 =: adj_data1 [i - 1],
: adj_data1 =: adj_data1 [i - 1] + (: data1 -: data1 [i - 1])
);
Si (falta) (: data1 ) &! Falta (: adj_data1 [i-1]),
lag_adj_data =: adj_data1 [i-1];
);
Si (falta) (: data1 [i-1]) y falta (: data1 )
: adj_data1 = lag_adj_data
);
);
Re: Usa Si Entonces En MatrizComo mencioné ayer, las fórmulas de columna son, en términos generales, bastante eficientes.
Consulte la tabla de datos adjunta. La columna New Adj Data tiene una fórmula que se acerca a lo que está buscando.
Este es todavía un conjunto de datos pequeño, pero aún debería funcionar bien con muchas filas.
-Jeff
Re: Usa Si Entonces En MatrizLas matrices funcionan como variables regulares, más precisamente llamadas los escalares - Con la mayoría de los operadores aritméticos y de comparación.
Por ejemplo:
X = El 1 , 2 , 3 , 4 ] ;
y = El 2 , 1 , 2 , 5 ] ;
X > y ;
/ *:
[0, 1, 1, 0]
Como puede ver, ahora tengo una matriz que indica dónde la matriz y es mayor que la matriz x.
Pero no estás limitado a comparar una matriz con otra. Puedes comparar con un escalar también.
X > 2 ;
/ *:
[0, 0, 1, 1]
También puedo realizar operaciones aritméticas en toda la matriz a la vez.
X - 4 ;
/ *:
[-3, -2, -1, 0]
Puede indexar en una matriz para obtener solo una parte de la matriz, de modo que pueda comparar fácilmente una parte de la matriz con otra.
y El 2 :: nrow ( y )] > y El 1 :: nrow ( y ) - 1 ] ;
/ *:
[0, 1, 1]
También puedes usar funciones en una matriz.
z = El 1 , 5 , 1 , - 6 ] ;
abdominales ( z El 2 :: nrow ( z )] - X El 1 :: nrow ( z ) - 1 ]) > 4 ;
/ *:
[0, 0, 1]
Combinando todo esto, debería poder hacer lo que está buscando con matrices.
Sin embargo, una fórmula de columna en la tabla de datos sería más sencilla y probablemente igual de eficiente. Seguiré mañana con un ejemplo de eso.
-Jeff
Re: Usa Si Entonces En MatrizGracias PMroz por la sugerencia. Esto definitivamente funcionará con los datos de la tabla, pero la tabla tiene unos 500,000 registros, y estaba pensando que hacer los ajustes en una matriz sería más rápido que tratar la tabla de datos directamente. ¿Tiene alguna sugerencia sobre la sintaxis para usar comandos condicionales en una matriz? He buscado en varios "libros" de JMP pero no he encontrado nada que especifique claramente la sintaxis. Gracias.
Re: Usa Si Entonces En MatrizCreo que esto hará lo que quieras. Estoy operando directamente en tu mesa, por cierto.
dt = tabla de datos ( "Ajustar para los datos faltantes" ) ;
para ( yo = 2 , yo <= las filas ( dt ) , yo ++,
di = columna ( dt , "Datos1" ) [ yo ] ;
dim1 = columna ( dt , "Datos1" ) [ yo - 1 ] ;
adji = columna ( dt , "Adj Data1" ) [ yo ] ;
Si ( ! Está perdido ( di ) Y ! Está perdido ( dim1 ) ,
Si ( abdominales ( di - dim1 ) > 4 ,
// entonces
columna ( dt , "Adj Data1" ) [ yo ] = columna ( dt , "Adj Data1" ) [ yo - 1 ] ;
,
// else
Si ( ! Está perdido ( adji ) ,
columna ( dt , "Datos1" ) [ yo ] = adji + ( di - dim1 ) ;
) ;
) ;
) ;
) ;