Wählen Sie den Ort aus, der auf mehreren Spalten basiert<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich bin nicht sicher, ob es eine gute Möglichkeit gibt, das zu tun, was ich hoffe, aber ich habe die folgende Situation:
Ich habe eine Datei, die das Ergebnis der Erfassung von Messungen jede Sekunde ist. Es gibt eine Zeitstempelspalte, eine Statusspalte und dann alle meine Datenspalten.
In der Statusspalte gibt es drei verschiedene Einträge: "RAMP", "WAIT" und "READ". Die allgemeine Reihenfolge der Daten nach der Zeit führt beispielsweise zu etwa 20 Zeilen "RAMP", gefolgt von 85 Zeilen "WAIT", gefolgt von 9 Zeilen "READ", die sich dann ein Dutzend Mal wiederholen. Meine Interessengebiete, die ich auswählen möchte, sind die letzten 30 Zeilen innerhalb jedes Abschnitts, die mit "WAIT" gekennzeichnet sind.
Natürlich ist es sehr einfach, alle "WAIT" -Zeilen oder die letzten 30 Zeilen der gesamten Datei auszuwählen, aber ich kann nicht herausfinden, wie man nur die letzten 30 jedes Abschnitts auswählt.
Gibt es einen guten Weg, dies zu lösen?
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausSo erhalten Sie den Tabellennamen und die Anzahl der Listenelemente:
dt = aktuell datierbar () ;
dt_name = dt << Name bekommen ;
lst = { "ein" . "b" . "c" } ;
Nitems ( lst ) ;
Verwenden Sie || eine Zeichenfolge mit einer anderen verketten:
"string" || ( dt << Name bekommen )
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausEine andere Funktion, die ich * weiß * muss, muss vorhanden sein, aber ich kann sie einfach nicht finden - current data table () gibt eine Referenz zurück, die ich dt zuweisen kann, aber ich suche nach einer Möglichkeit, den Namen der Tabelle zu extrahieren - ich habe ein Skript Ich möchte auf vielen verschiedenen Tabellen laufen, und ich möchte es in der aktuellen Tabelle starten und dann eine neue Untermenge-Tabelle mit dem Namen " " erstellen. Ich hatte erwartet, dass der Ausgabetabellenname ("string" dt) oder ("string" $ dt) funktioniert, etwas ähnliches, aber es funktioniert nicht. Ich jage durch die Dokumentationssuche, dachte aber, ich würde diesen Kommentar rauswerfen.
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausIch habe einen Weg gefunden, die gewünschte Liste zu erstellen. Ich fügte hinzu:
last_30_waits = {};
für (j = 1, j <= 3, j ++,
für (i = 0, i <= 3, i ++,
insertinto (last_30_waits, (wait_end_list)- ich))));
dt << Zeilen auswählen (last_30_waits);
Aber ich habe das Gefühl, dass das nicht optimal ist. Gibt es auch eine Funktion, die die Anzahl der Einträge in einer Liste zurückgibt? Ich möchte die "3" in meiner ersten for-Schleife durch diese Funktion ersetzen, aber ich habe Probleme, sie zu finden.
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausDanke, das bringt mich wirklich näher, aber ich habe noch eine ahnungslose Frage - wie kann ich alles zwischen * jedem Paar von wait_start_list / wait_end_list-Nummern auswählen? Ich habe noch nicht mit Listen gearbeitet. (Im Allgemeinen bin ich mit Skripten wirklich neu, aber ich versuche zu lernen, wenn ich das Beste mache, was ich kann.)
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausHier ist eine Möglichkeit, dies zu tun. Sie suchen nach allen WAIT-Zeilen und durchlaufen dann die Zeilennummern. Wenn eine Lücke größer als 1 ist, haben Sie das Ende eines Abschnitts gefunden. Mit dem folgenden Code werden zwei Listen erstellt, die die Anfangs- und Endzeilennummern für jeden Abschnitt angeben. Ich habe eine kleine Tabelle für dieses Beispiel erstellt. ändere das ntail Parameter zu 30 für Ihre Daten.
dt = Neue Tabelle ( "temp" .
Zeilen hinzufügen ( 39 ) .
Neue Spalte ( "Status" .
Charakter .
Nominal .
Werte setzen (
{ "RAMPE" . "RAMPE" . "RAMPE" . "WARTEN" . "WARTEN" . "WARTEN" . "WARTEN" . "WARTEN" . "LESEN" .
"LESEN" . "LESEN" . "LESEN" . "LESEN" . "RAMPE" . "RAMPE" . "RAMPE" . "WARTEN" . "WARTEN" .
"WARTEN" . "WARTEN" . "WARTEN" . "LESEN" . "LESEN" . "LESEN" . "LESEN" . "LESEN" . "RAMPE" .
"RAMPE" . "RAMPE" . "WARTEN" . "WARTEN" . "WARTEN" . "WARTEN" . "WARTEN" . "LESEN" . "LESEN" .
"LESEN" . "LESEN" . "LESEN" }
)
) .
) ;
wait_rows = dt << reihen wo ( : Status == "WARTEN" ) ;
Nr = nrows ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
// Anzahl der zu wartenden WAIT-Zeilen
ntail = 4 ;
// Dies wird die letzten 4 WAIT-Zeilen erhalten. Ersetzen Sie durch 30, um die letzten 30 WAIT-Zeilen zu erhalten
zum ( ich = 1 . ich <= Nr . ich ++
new_row = wait_rows [ ich ] ;
// In der Liste der Zeilen nach einer Lücke suchen, die größer als eine ist
ob (( new_row - old_row ) > 1 .
einfügen in ( wait_start_list . ( old_row - ntail + 1 )) ;
einfügen in ( wait_end_list . old_row ) ;
) ;
old_row = new_row ;
) ;
// Kümmere dich um den letzten Satz von WAITs
old_row = wait_rows [ Nr ] ;
einfügen in ( wait_start_list . ( old_row - ntail + 1 )) ;
einfügen in ( wait_end_list . old_row ) ;
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausLeider bin ich momentan nur JMP, keine Basis-SAS - aber danke für den Vorschlag.
Re: Wählen Sie den Ort basierend auf mehreren Spalten ausSie haben dies im JMP-Forum veröffentlicht, daher bin ich mir nicht sicher, ob dies hilft oder nicht. Bei Verwendung von Basis-SAS ist dies ein relativ kurzes Programm, wenn Sie die richtigen Tools verwenden:
data last_30_waits;
Gruppennummer + 1;
n_waits = 0;
tun bis (last.status und status = 'WAIT');
Messwerte einstellen (keep = status);
durch Status nicht sortiert;
wenn status = 'WAIT', dann wartet n_ + 1;
Ende;
** An dieser Stelle identifiziert group_num eine Gruppe von WAITs und n_waits zeigt an, wie viele Datensätze sich in der Gruppe befinden.
n_found = 0;
tun bis (last.status und status = 'WAIT');
Maße einstellen;
durch Status nicht sortiert;
wenn status = 'WAIT' dann tun;
n_fund + 1;
wenn n_found> = n_waits - 29 dann ausgegeben wird;
Ende;
Ende;
n_found fallen lassen;
Lauf;
Viel Glück.