Semplice domanda sui loopCiao,
Sono un utente JMP di lunga data, ma solo di recente ho iniziato a conoscere gli script. Sto cercando di imparare le basi e una delle cose fondamentali che voglio padroneggiare è l'uso dei cicli for.
Quindi ho creato un set di dati di esempio con 4 colonne:
1) PATIENTID: elenco di valori univoci per il numero del paziente
2) VALORE: valore di una valutazione del paziente in un determinato momento
3) TIME: Momento in cui è stata raccolta la valutazione del paziente
4) PARAM: La valutazione del paziente è suddivisa in 4 item e un punteggio totale
Ho scritto uno script per scorrere tutte le righe in questa tabella di dati e per valutare i valori di due diverse variabili (: TIME e : VALUE). Se la condizione è soddisfatta, vorrei aggiungere un valore di carattere a una riga in una nuova colonna che è Sì o No.
Ecco la sceneggiatura che ho scritto. JMP restituisce valori vuoti per ciascuna delle righe nella nuova colonna:
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"
)
)
)
;Questo è uno script semplice e, una volta compresi i meccanismi, vorrei aggiungere più condizioni. Ma sono bloccato a questo punto perché lo script non funziona correttamente.
Ho anche provato a scrivere questo script usando la funzione For Each Row, ma ho ancora lo stesso problema.
Qualche consiglio su cosa sto sbagliando? Scusa se questa è una risposta semplice, ho esaminato la documentazione e non riesco a capire cosa sto facendo di sbagliato.
Ri: semplice domanda sui loopI cicli vengono solitamente utilizzati per scorrere le righe di una tabella o gli elementi di un elenco, quindi un incremento di uno è più comune. Tuttavia, il terzo argomento non deve essere i++. Potrebbe essere qualsiasi cosa abbia senso.
Alcuni esempi:
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)
Ri: semplice domanda sui loopNon funziona perché il ciclo è posizionato all'interno della definizione Nuova colonna. Creare la colonna e inserirne i valori in istruzioni separate oppure utilizzare una formula di colonna.
Guarda questi tre esempi jsl che dovrebbero dare risultati identici:
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"))
);
Ri: semplice domanda sui loopIl compito che vuoi svolgere può essere realizzato in due modi:
a) utilizzare una proprietà Formula per la colonna:
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) iterare con un ciclo
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"
)
);puoi anche usare For Each Row ()
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"
)
);
Ri: semplice domanda sui loopUn'altra domanda:
La documentazione JSL afferma che i cicli for vengono incrementati utilizzando il terzo argomento nella funzione For. Ho visto questo in genere scritto come i++. Presumo che ciò significhi incrementare i sul posto di 1. Ma cosa devo fare se voglio incrementare di valori inferiori a 1? Come scrivo l'argomentazione?
La documentazione JSL e lo strumento di indice di scripting non fanno menzione di come farlo.
GrazieRi: semplice domanda sui loopEcco uno script simile che ho scritto per eseguire la stessa operazione, ma utilizzando invece il file Per ogni riga funzione. Anche questo non funziona.
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"
)
)
)
;Qualsiasi aiuto apprezzato