Verwenden Sie If Then für Matrix<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo Leute,
Ich habe einige Instrumentendaten, die periodisch große Änderungen in den Daten zeigen, weil das Instrument neu eingestellt wird. Ich versuche, eine neue Variable zu erstellen, die Folgendes bewirkt: Wenn (Daten - Daten [i-1]> 4) oder (Daten) - data [i-1] <-4), dann adj_data = adj_data [i-1], Else, Daten = adj_data + (Daten - Daten [i-1]); Wenn der aktuelle Datenwert den vorherigen Wert um 4 oder -4 übersteigt, muss der neue angepasste Wert dem vorherigen angepassten Wert gleichgesetzt werden. Andernfalls wird die Differenz zwischen dem aktuellen und dem vorherigen Datenwert dem angepassten Wert hinzugefügt.
Ich habe herausgefunden, wie man die Daten in eine Matrix einliest und fehlende Daten entfernt, aber ich bin nicht sicher, wie ich die oben in der Matrix beschriebenen Berechnungen ausführen soll. Anregungen, wie dies zu erreichen ist, würden wir begrüßen.
Protokoll löschen();
Namensvorgabe bis hier (1);
dt = Neue Tabelle ("Für fehlende Daten anpassen"),
Zeilen hinzufügen (24),
Datei beim Speichern komprimieren (1),
Neue Spalte ("Datum",
Numerisch,
Kontinuierlich,
Format ("m / d / y", 19),
Eingabeformat ("m / d / y"),
Werte setzen (
[3447619200, 3447705600, 3447792000, 3447878400, 3447964800
3448051200, 3448137600, 3448224000, 3448310400, 3448396800
3448483200, 3448569600, 3448656000, 3448742400, 3448828800
3448915200, 3449001600, 3449088000, 3449174400, 3449260800
3449347200, 3449433600, 3449520000, 3449606400]
)
)
Neue Spalte ("Data1",
Numerisch,
Kontinuierlich,
Format ("Best", 12),
Werte setzen (
[11, 13, 50, 15, ..., 17, 18, -20, 20, ..., 21, 22, ..., 24, 25, 23,.
25, 26, 27, 28]
)
)
Neue Spalte ("Adj Data1")
Numerisch,
Kontinuierlich,
Format ("Best", 12),
Werte setzen (
[0, 2, ..., 4, ..., 6, 7, ..., 9,, 10, 11,., 13, 14, 12, ...,.,., 14,
15, 16, 17]
)
)
);
// Füge relevante Daten in die Matrix ein
date_time =: Name ("Date") << Werte abrufen;
data =: Name ("Data1") << Werte abrufen;
// Ermitteln Sie Zeilen, die nur Daten enthalten, die nicht fehlen
row_list = dt << Zeilen bekommen wo (
Und(
Fehlt (: Data1),
Enthält (Daten,: Daten1),
Enthält (Daten,: Daten1) == Enthält (Datum_Uhrzeit, Format (: Datum, "Mdy"))
)
);
// Konvertiert row_list, derzeit eine Matrix [], in eine Liste {}.
Ist Liste (row_list = Als Liste (row_list));
date_time = date_time [Loc (! fehlt (Daten))]];
data = data [Loc (! fehlt (data))]];
Re: Verwenden Sie If Then auf MatrixTut mir leid, Jeff. Ich war mir nicht klar, was ich erreichen möchte. Ich habe die Dinge möglicherweise verwirrt, indem ich sowohl über JSL-Code als auch über Spaltenformeln sprach.
Die angehängte Datendatei zeigt die "gewünschte" Ausgabe in: adj_data1 und die Ausgabe der Spaltenformel, die Sie in New Adj Data angegeben haben. Beachten Sie, dass in der Spalte New Adj Data der vorherige Wert für New Adj Data eingefügt wird, wenn: data1 fehlt, obwohl das Ziel darin besteht, dass New Adj Data fehlende Daten anzeigt, wenn: data1 fehlt.
Um die: adj_data1-Spalte zu erstellen, habe ich versucht, Ihre Spaltenformel so anzupassen, dass:
- Wenn: data1 fehlt, wird der vorherige Wert für neue Adj-Daten in eine lokale Variable eingefügt und so lange übertragen, bis er in Schritt 2 benötigt wird
- Wenn current: Wert von data1 nicht fehlt & zurück: data1-Wert fehlt, dann werden Neue Daten in der Liste der aktuellen Werte in der lokalen Variablen festgelegt.
Wo ich aufgehängt werde, ist das Hinzufügen der New Adj Data-Werte in Schritt 1 zu einer lokalen Variablen und das Abrufen / Verwenden dieses Werts für Schritt 2.
Vielleicht mache ich es komplizierter, als es sein muss, und Sie haben eine einfache Möglichkeit, dies zu erreichen. Ich würde mich sehr freuen, wenn Sie mir helfen könnten. Wenn Ihre Lösung keine lokale Variable in der Spaltenformel verwendet, wäre ich auch dankbar, wenn Sie entweder ein einfaches Beispiel für die Verwendung einer lokalen Variablen wie oben beschrieben angeben oder auf eine vorhandene JMP-Datenmenge verweisen verwendet lokale Variablen in der Spaltenformel. Es scheint sehr hilfreich zu sein, lokale Variablen erfolgreich in Spaltenformeln verwenden zu können. Danke noch einmal.
Re: Verwenden Sie If Then auf MatrixHaben Sie eine Anleitung, wie ich den folgenden JSL-Code mithilfe lokaler Variablen in einer Spaltenformel ausführen kann?
Wenn Sie in einem JSL-Programm Variablen definieren und diese in einer Spaltenformel verwenden möchten, müssen diese globale Variablen sein. Präfixieren Sie die Variablen mit "::" und Sie können sie in einer Spaltenformel verwenden. Zum Beispiel :: g_one_variable
Re: Verwenden Sie If Then auf MatrixHallo Terapin,
Ich fürchte, es fällt mir schwer, anhand Ihrer gesendeten JSL zu verstehen, was Sie vorhaben.
Die Datentabelle, die ich oben angehängt habe, behandelt die fehlenden Werte in data1, ohne dass eine lokale Variable in der Formel benötigt wird. Es wird geprüft, ob in der aktuellen Zeile oder in der vorherigen Zeile mit der Angabe! Fehlt (Data1 - Lag (: Data1,1)) Data1 fehlt. Wenn einer der beiden fehlt, fehlt auch der Unterschied.
Hier ist die Formel in der Spalte New Adj Data:
Ob(
Zeile () == 1, 0,
Abs (: Data1 - Lag (: Data1, 1))> 4 | Fehlt (: Daten1 - Verzögerung (: Daten1, 1)), Verzögerung (: Neue Einstelldaten, 1),
Lag (: Neue Adj-Daten, 1) + (: Data1 - Lag (: Data1, 1))
)
Wenn dies nicht das ist, was Sie brauchen, können Sie eine Beispieldatentabelle mit einer Erläuterung dazu veröffentlichen, was genau der Wert für diese neue formelbasierte Spalte in jeder Zeile sein soll. Das hilft mir, genau zu verstehen, wonach Sie suchen.
Vielen Dank!
-Jeff
Re: Verwenden Sie If Then auf MatrixVielen Dank Jeff, dass Sie ein Beispiel für eine Spaltenformel sowie die Matrixbeispiele bereitgestellt haben. Wie Sie sich vorstellen können, ist mein Fall etwas komplizierter und erfordert, dass ich Zeilen überspringe, in denen die Daten fehlen, aber den vorherigen angepassten Datenwert mitnehmen. Ich kann dies mit dem folgenden JSL-Code erreichen, kann jedoch nicht herausfinden, wie lokale Variablen in einer Spaltenformel verwendet werden. Haben Sie eine Anleitung, wie ich den folgenden JSL-Code mithilfe lokaler Variablen in einer Spaltenformel ausführen kann? Vielen Dank.
Protokoll löschen();
lag_adj_data = 0;
: adj_data1 [1] = 0;
Für (i = 2, i <= N Zeilen (dt1), i ++,
If (Abs (: data1 -: data1 [i - 1])> 4,
: adj_data1 =: adj_data1 [i - 1],
: adj_data1 =: adj_data1 [i - 1] + (: data1 -: data1 [i - 1])
);
If (fehlt (: data1 ) &! Fehlt (: adj_data1 [i-1]),
lag_adj_data =: adj_data1 [i-1];
);
If (fehlt (: data1 [i-1]) &! Fehlt (: data1 )
: adj_data1 = lag_adj_data
);
);
Re: Verwenden Sie If Then auf MatrixWie ich gestern angedeutet habe, sind Spaltenformeln im Allgemeinen ziemlich effizient.
Siehe die beigefügte Datentabelle. Die Spalte New Adj Data enthält eine Formel, die dem entspricht, wonach Sie suchen.
Dies ist immer noch ein kleines Dataset, sollte aber mit vielen Zeilen noch gut funktionieren.
-Jeff
Re: Verwenden Sie If Then auf MatrixMatrizen funktionieren wie reguläre Variablen - genauer aufgerufen Skalare - mit den meisten Arithmetik- und Vergleichsoperatoren.
Zum Beispiel:
x = [ 1 . 2 . 3 . 4 ] ;
y = [ 2 . 1 . 2 . 5 ] ;
x > y ;
/ *:
[0, 1, 1, 0]
Wie Sie sehen, habe ich jetzt eine Matrix, die angibt, wo die Y-Matrix größer als die X-Matrix ist.
Sie sind jedoch nicht darauf beschränkt, eine Matrix mit einer anderen zu vergleichen. Sie können auch mit einem Skalar vergleichen.
x > 2 ;
/ *:
[0, 0, 1, 1]
Ich kann auch arithmetische Operationen auf der gesamten Matrix gleichzeitig ausführen.
x - 4 ;
/ *:
[-3, -2, -1, 0]
Sie können in eine Matrix indizieren, um nur einen Teil der Matrix zu erhalten, sodass Sie einen Teil der Matrix leicht mit einem anderen vergleichen können.
y [ 2 :: Nr ( y )] > y [ 1 :: Nr ( y ) - 1 ] ;
/ *:
[0, 1, 1]
Sie können auch Funktionen in einer Matrix verwenden.
z = [ 1 . 5 . 1 - 6 ] ;
Abs ( z [ 2 :: Nr ( z )] - x [ 1 :: Nr ( z ) - 1 ]) > 4 ;
/ *:
[0, 0, 1]
Wenn Sie all dies kombinieren, sollten Sie in der Lage sein, mit Matrizen das zu tun, wonach Sie suchen.
Eine Spaltenformel in der Datentabelle wäre jedoch einfacher und wahrscheinlich genauso effizient. Ich werde morgen ein Beispiel dafür geben.
-Jeff
Re: Verwenden Sie If Then auf MatrixDanke an PMroz für den Vorschlag. Dies wird definitiv für die Daten in der Tabelle funktionieren, aber die Tabelle enthält etwa 500.000 Datensätze, und ich dachte, dass die Anpassung in einer Matrix schneller wäre als der direkte Umgang mit der Datentabelle. Haben Sie Vorschläge zur Syntax für die Verwendung bedingter Befehle in einer Matrix? Ich habe in den verschiedenen JMP-"Büchern" nachgesehen, aber nichts gefunden, was die Syntax eindeutig spezifiziert. Vielen Dank.
Re: Verwenden Sie If Then auf MatrixIch denke, das wird tun, was du willst. Ich arbeite direkt auf Ihrem Tisch, übrigens.
dt = Datentabelle ( "Für fehlende Daten anpassen" ) ;
zum ( ich = 2 . ich <= nrows ( dt ) . ich ++
di = Säule ( dt . "Data1" ) [ ich ] ;
dim1 = Säule ( dt . "Data1" ) [ ich - 1 ] ;
adji = Säule ( dt . "Adj Data1" ) [ ich ] ;
ob ( ! wird vermisst ( di ) & ! wird vermisst ( dim1 ) .
ob ( Abs ( di - dim1 ) > 4 .
// dann
Säule ( dt . "Adj Data1" ) [ ich ] = Säule ( dt . "Adj Data1" ) [ ich - 1 ] ;
.
// sonst
ob ( ! wird vermisst ( adji ) .
Säule ( dt . "Data1" ) [ ich ] = adji + ( di - dim1 ) ;
) ;
) ;
) ;
) ;