Pregunta simple sobre buclesHola,
Soy usuario de JMP desde hace mucho tiempo, pero recientemente comencé a aprender sobre scripts. Estoy tratando de aprender los conceptos básicos y una de las cosas clave que quiero dominar es el uso de bucles for.
Entonces creé un conjunto de datos de muestra con 4 columnas:
1) PATIENTID: lista de valores únicos para el número de paciente
2) VALOR: Valor de la calificación de un paciente en un momento determinado
3) HORA: Momento en el que se recopiló la calificación del paciente
4) PARAM: La calificación del paciente se divide en 4 ítems y una puntuación total
Escribí un script para recorrer todas las filas de esta tabla de datos y evaluar los valores de dos variables diferentes (:TIME y :VALUE). Si se cumple la condición, me gustaría agregar un valor de carácter a una fila en una nueva columna que sea Sí o No.
Aquí está el guión que escribí. JMP devuelve valores vacíos para cada una de las filas de la nueva columna:
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
For (i = 1, i <= tr, i++,
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;Este es un script simple y, una vez que comprenda la mecánica, me gustaría agregar más condiciones. Pero estoy atascado en este punto porque el script no funciona correctamente.
También intenté escribir este script usando la función Para cada fila, pero sigo teniendo el mismo problema.
¿Algún consejo sobre lo que estoy haciendo mal? Lo siento si esta es una respuesta simple, revisé la documentación y parece que no puedo entender qué estoy haciendo mal.
Re: Pregunta simple sobre buclesLos bucles generalmente se usan para iterar a través de filas de una tabla o sobre elementos de una lista, por lo que un incremento en uno es lo más común. Sin embargo, el tercer argumento no debe ser i++. Podría ser cualquier cosa que tenga sentido.
Algunos ejemplos:
For(i = 1, i <= 10, i = i + 0.1, Expr()); // Increment < 1 (100 iterations)
For(i = 10, i > 1, i--, Expr()); // Loop "backwards"
For(x = 2, x <= 10, x = 2, Expr()); // Eternal loop (better avoid these)
Re: Pregunta simple sobre buclesNo funciona porque el bucle se coloca dentro de la definición de Nueva columna. Cree la columna y complete sus valores en declaraciones separadas o use una fórmula de columna.
Mire estos tres ejemplos de jsl que deberían dar un resultado idéntico:
Names Default To Here(1);
dt = Current Data Table();
tr = N Rows(dt);
//1. Fill values with a For() loop
dt << New Column("TEST", "CHARACTER");
For(i = 1, i <= tr, i++,
:TEST[i] = If(:TIME[i] == "BASELINE" & :VALUE[i] > 3,
"YES",
"NO"
)
);
//2. Fill with For Each Row()
dt << New Column("TEST2", "CHARACTER");
For Each Row(:TEST2 = If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"));
//3. Use a column formula in TEST3
dt << New Column("TEST3",
"CHARACTER",
Formula(If(:TIME == "BASELINE" & :VALUE > 3, "YES", "NO"))
);
Re: Pregunta simple sobre buclesLa tarea que desea realizar se puede realizar de dos maneras:
a) utilizar una propiedad Fórmula para la columna:
Names Default To Here( 1 );
dt = current data table ();
tr = N Rows (dt);
dt << New Column ("TEST", "CHARACTER",
Formula(
If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;b) iterar con un bucle
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for(ii=1, ii<=N Rows(dt), ii++,
:test[ii]=If(
(:TIME[ii] == "BASELINE" & :VALUE[ii] > 3)
,"YES"
,"NO"
)
);también puedes usar Para cada fila()
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER", Character, Nominal);
for each row(
:test=If(
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
);
Re: Pregunta simple sobre buclesUna pregunta más:
La documentación JSL dice que los bucles for se incrementan utilizando el tercer argumento en la función For. He visto esto típicamente escrito como i++. Supongo que esto significa incrementar i en 1. ¿Pero qué hago si quiero incrementar en valores menores a 1? ¿Cómo escribo el argumento?
La documentación de JSL y la herramienta de índice de secuencias de comandos no mencionan cómo hacer esto.
GraciasRe: Pregunta simple sobre buclesAquí hay un script similar que escribí para realizar la misma tarea, pero en su lugar usando el Por cada fila función. Esto tampoco funciona.
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", "CHARACTER",
For Each Row (dt,
If (
(:TIME == "BASELINE" & :VALUE > 3)
,"YES"
,"NO"
)
)
)
;Cualquier ayuda apreciada