Einfache Frage zu SchleifenHallo,
Ich bin ein langjähriger JMP-Benutzer, habe aber erst vor Kurzem begonnen, etwas über Skripte zu lernen. Ich versuche, die Grundlagen zu erlernen, und eines der wichtigsten Dinge, die ich beherrschen möchte, ist die Verwendung von for-Schleifen.
Also habe ich einen Beispieldatensatz mit 4 Spalten erstellt:
1) PATIENTID: Liste eindeutiger Werte für die Patientennummer
2) WERT: Wert einer Patientenbewertung zu einem bestimmten Zeitpunkt
3) ZEIT: Zeitpunkt, zu dem die Patientenbewertung erfasst wurde
4) PARAM: Die Patientenbewertung wird in 4 Punkte und einen Gesamtscore unterteilt
Ich habe ein Skript geschrieben, um alle Zeilen in dieser Datentabelle zu durchlaufen und die Werte zweier verschiedener Variablen (:TIME und :VALUE) auszuwerten. Wenn die Bedingung erfüllt ist, möchte ich einer Zeile in einer neuen Spalte einen Zeichenwert hinzufügen, der entweder „Ja“ oder „Nein“ ist.
Hier ist das Skript, das ich geschrieben habe. JMP gibt leere Werte für jede der Zeilen in der neuen Spalte zurück:
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"
)
)
)
;Dies ist ein einfaches Skript, und sobald ich die Mechanik verstanden habe, möchte ich weitere Bedingungen hinzufügen. Aber ich stecke an dieser Stelle fest, weil das Skript nicht richtig funktioniert.
Ich habe auch versucht, dieses Skript mit der Funktion „Für jede Zeile“ zu schreiben, habe aber immer noch das gleiche Problem.
Irgendwelche Ratschläge, was ich falsch mache? Tut mir leid, wenn das eine einfache Antwort ist. Ich habe die Dokumentation durchgesehen und kann anscheinend nicht herausfinden, was ich falsch mache.
Betreff: Einfache Frage zu SchleifenSchleifen werden normalerweise zum Durchlaufen von Tabellenzeilen oder über Elemente in einer Liste verwendet, daher ist eine Inkrementierung um eins am häufigsten. Das dritte Argument darf jedoch nicht i++ sein. Es könnte alles sein, was Sinn macht.
Ein paar Beispiele:
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)
Betreff: Einfache Frage zu SchleifenDies funktioniert nicht, da die Schleife innerhalb der Definition „Neue Spalte“ platziert ist. Erstellen Sie entweder die Spalte und geben Sie ihre Werte in separate Anweisungen ein, oder verwenden Sie eine Spaltenformel.
Schauen Sie sich diese drei JSL-Beispiele an, die zu identischen Ergebnissen führen sollten:
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"))
);
Betreff: Einfache Frage zu SchleifenDie Aufgabe, die Sie erledigen möchten, kann auf zwei Arten erledigt werden:
a) Verwenden Sie eine Formeleigenschaft für die Spalte:
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) Mit einer Schleife iterieren
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"
)
);Sie können auch For Each Row() verwenden
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"
)
);
Betreff: Einfache Frage zu SchleifenNoch eine Frage:
In der JSL-Dokumentation heißt es, dass die for-Schleifen mithilfe des dritten Arguments in der For-Funktion inkrementiert werden. Ich habe gesehen, dass dies typischerweise als i++ geschrieben wurde. Ich gehe davon aus, dass dies bedeutet, i an Ort und Stelle um 1 zu erhöhen. Aber was mache ich, wenn ich um Werte kleiner als 1 erhöhen möchte? Wie schreibe ich das Argument?
In der JSL-Dokumentation und im Scripting-Index-Tool wird nicht erwähnt, wie das geht.
DankeBetreff: Einfache Frage zu SchleifenHier ist ein ähnliches Skript, das ich geschrieben habe, um die gleiche Aufgabe zu erfüllen, aber stattdessen das verwendet habe Für jede Reihe Funktion. Das funktioniert auch nicht.
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"
)
)
)
;Jede Hilfe wird geschätzt