Frage zum Durchlaufen von ZeilenHallo,
Ich bin für alle vorherigen Antworten so dankbar und lerne jeden Tag mehr über JSL. Zu diesem Zeitpunkt bin ich mit den Grundlagen vertraut und habe etwas darüber gelernt Für Schleifen, Für jede Reihe und Nutzung der Formel Funktion. Das war sehr hilfreich. Wie ich in meinem vorherigen Beitrag erwähnt habe, arbeite ich an einem Datensatz und habe vier Schlüsselspalten:
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 setzt sich aus 4 einzelnen Items und einer Gesamtpunktzahl (ITEM1, ITEM2, ITEM3, ITEM4 und TOTAL) zusammen. Die Gesamtpunktzahl ist einfach eine Summe aus ITEM1+ITEM2+ITEM3+ITEM4.
Daraus möchte ich eine fünfte Spalte erstellen (genannt „TEST“). Der Wert für TEST basiert auf der folgenden Logik:
Für einen einzelnen Patienten, wenn Grundlinie Werte sind:
- GESAMT > 9 oder
- 1 von ITEM1, ITEM2, ITEM3 oder ITEM4 sind > 3 oder
- 3 von ITEM1, ITEM2, ITEM3 oder ITEM4 sind > 2
Dann sollte die entsprechende Zeile in „TEST“ mit „JA“ ausgewertet werden. Nicht-Basiswerte und andere Werte sollten mit „NEIN“ bewertet werden. Diese Logik sollte auf jeden Patienten und jede Zeile in der Datentabelle angewendet werden.
Ich habe Probleme beim Durchlaufen der Zeilen in meinem Datensatz. Der Grund dafür ist, dass jeder Patient eine unterschiedliche Anzahl an Zeitpunkten hat, zu denen er die Skala ausgefüllt hat. Einige Patienten brachen die Behandlung vorzeitig ab. Da jeder Patient eine andere Anzahl von Zeilen hat, fällt es mir schwer herauszufinden, wie ich die Zeilen durchlaufen kann, um das Skript zu schreiben.
Ich habe versucht, einige IF-Anweisungen zu kombinieren, bleibe aber an dem Punkt hängen, an dem ich zur nächsten Patienten-ID iterieren muss. Ich füge ein Skript bei, das ich geschrieben habe, aber nicht weiterkomme. Jede Hilfe wird sehr geschätzt.
Names Default To Here( 1 );
dt = current data table ();
dt << New Column ("TEST", Character, Formula(
If(:TIME == "BASELINE",
theRow = Row();
thePatient = :PATIENTID;
If(:PARAM == "TOTAL",
If(N Rows(dt << Get Rows Where(
Row()>=theRow &
thePatient == :PATIENTID &
:VALUE > 9
)
) > 0
,"YES"
,"NO"
)))
));Hier ist ein Beispiel dafür, wie die Datentabelle aussieht (echte Patienteninformationen, aus Datenschutzgründen geschwärzt)

Betreff: Frage zum Durchlaufen von ZeilenDanke, das macht jetzt vollkommen Sinn. Vielen Dank, dass Sie sich die Zeit genommen haben, es zu erklären, sehr hilfreich!!
Betreff: Frage zum Durchlaufen von Zeilen@SrihariGopal ,
In Ihrem ersten Beitrag wurde erläutert, wie Formeln und Set Each Value() die Zeilen durchlaufen.Hier sind einige Informationen, die Sie im Hinterkopf behalten sollten:
- Logische Aussagen werden als wahr oder falsch bewertet. True entspricht 1 und False entspricht Null
- Angenommen, x ist ein numerischer Wert. Die JSL-Funktion If( x, „YES“, „NO“ ) untersucht den Wert von x. Wenn x > 0, dann ist das Ergebnis True(1)=>YES , andernfalls False(0)=>NO.
- :TIME == „BASELINE“ ist eine logische Anweisung, die eine 1 oder 0 zurückgibt, sodass anstelle der Verwendung eines „AND“ (&) die Multiplikationsfunktion funktioniert. Mit anderen Worten: TIME muss gleich BASELINE sein und eine der Regeln muss wahr sein, also 1*1 = 1. Wenn einer der beiden Werte falsch ist, ist das Ergebnis Null oder falsch.
- Die äußere Maximum()-Funktion hat 3 Argumente, die 3 Regeln. Diese Maximumfunktion ersetzt „OR“ ( | ). Wenn alle 3 Regeln falsch sind, gibt das äußere Maximum eine 0 zurück. Wenn eine der drei Regeln eine 1 (Wahr) zurückgibt, gibt das Maximum eine 1 zurück. Beachten Sie jedoch, dass dieses Ergebnis den logischen Multiplikator hat, sodass dies nur für BASELINE-Werte gilt.
- Zu den Regeln: Regel Nr. 1 ( :TOTAL > 9 ) gibt eine 1 oder 0 zurück. Regel Nr. 2 ermittelt das Maximum der 4 Elemente. Wenn dieses größer als 3 ist, ist mindestens ein Element größer als 3. Regel Nr. 3 ist die Summe von 4 logischen Ergebnissen (ITEM 1 >2 usw.). Wenn diese Summe größer als 2 ist, sind 3 oder 4 der Elemente größer als 2.
Durch die Verwendung von Arithmetik bei logischen Anweisungen ist es einfacher und schneller, Fälle zu finden, die die „k von n“-Regeln erfüllen. Es gibt andere Methoden wie die Verkettung der 4 ITEMs und die Prüfung, ob sie sich in { „0111“, „1011“, „1101“, „1110“} befinden, oder sie in numerische Werte umwandeln und nach diesen Werten suchen.Für die Summe ist jedoch nur eine Prüfung erforderlich (>2).Da ich für Regel Nr. 3 Arithmetik verwendet habe, habe ich für die verbleibende Logik mathematische Funktionen Maximum() anstelle von OR und Multiplikation anstelle von AND verwendet.Beachten Sie, dass Sie Anweisungen haben können, die logische Funktionen mit mathematischen Funktionen kombinieren.
Hoffentlich hilft das.
Betreff: Frage zum Durchlaufen von ZeilenVielen Dank! Das hat perfekt funktioniert.
Ich lese gerade das Drehbuch durch und frage mich, ob Sie es etwas näher erläutern könnten. Wie funktioniert die MAXIMUM-Funktion in diesem Zusammenhang? Ich verstehe, dass Sie nach maximal den drei Regeln suchen. Ich sehe jedoch den *-Operator, der meiner Meinung nach Multiplikation bedeutet. Ich war verwirrt darüber, wie die Multiplikation zusammen mit der MAXIMUM-Funktion in der IF-Anweisung zusammenwirkt.
Vielen Dank!Betreff: Frage zum Durchlaufen von Zeilen@SrihariGopal ,
Sie haben angegeben, dass Ihr Ziel darin besteht
Für einen einzelnen Patienten, wenn Grundlinie Werte sind:
- GESAMT > 9 oder
- 1 von ITEM1, ITEM2, ITEM3 oder ITEM4 sind > 3 oder
- 3 von ITEM1, ITEM2, ITEM3 oder ITEM4 sind > 2
Dann sollte die entsprechende Zeile in „TEST“ mit „JA“ ausgewertet werden. Nicht-Basiswerte und andere Werte sollten mit „NEIN“ bewertet werden. Diese Logik sollte auf jeden Patienten und jede Zeile in der Datentabelle angewendet werden.
Komplexe Regeln in einer gestapelten Tabelle können ausgeführt werden, aber sie werden chaotisch. Es ist viel einfacher zu verwalten, wenn die Tabelle nach PATIENTID und TIME entstapelt wird, wobei die Regeln durch PARAM angewendet werden. Wenn die Tabelle extrem groß ist, ist diese Methode möglicherweise nicht effizient.
Im Anhang finden Sie Ihre Beispieltabelle mit zwei zusätzlichen PATIENTIDs zum Testen dieser drei Regeln.Bevor Sie das beigefügte Skript verwenden, sollten Sie prüfen, ob die Formel Ihre drei Regeln ausreichend erfasst. Ich habe eine Kommentarspalte und Farben hinzugefügt, um die Überprüfung zu erleichtern.

Nach der Aufteilung finden Sie hier die Formel für die TEST-Spalte mit drei Regeln. Das Skript enthält außerdem den JSL-Code zum Entstapeln und Neuorganisieren der Tabelle.
dt_split:TEST << Set Each Value(
If(
(:TIME == "BASELINE") *
Maximum(
:TOTAL > 9, //rule 1
Maximum( :ITEM1, :ITEM2, :ITEM3, :ITEM4 ) > 3, //rule 2
(:ITEM1 > 2) + (:ITEM2 > 2) + (:ITEM3 > 2) + (:ITEM4 > 2) >= 3 //rule 3
),
"YES",
"NO"
));
.