Wenn ich über mein Berufsleben nachdenke, bin ich relativ neu in JMP. Tatsächlich begann meine Erfahrung mit JMP und JSL (JMP Scripting Language) an dem Tag, an dem ich vor etwa vier Jahren Entwickler in der JMP Life Sciences-Gruppe wurde. Im Gegensatz dazu verwende ich SAS seit meiner Grundausbildung in Mathematik und habe mehr als 20 Jahre Erfahrung. Zwar gibt es viele Unterschiede zwischen den beiden Sprachen, aber eines der Dinge, die ich an meinem Job am meisten schätze, ist die Verwendung dieses sehr umfangreichen und reichhaltigen Tools, um coole neue Funktionen zu entwickeln JMP Clinical .
Obwohl ich Zugang zu beiden habe JMP und SAS Ich frage mich manchmal, wie ich eine Funktion in SAS mithilfe von JSL replizieren kann. In diesem Blogbeitrag wird beschrieben, wie das Verhalten von SAS-Datenschritten repliziert wird, um den ersten und den letzten Datensatz innerhalb von Gruppen auszuwählen. In SAS erfolgt dies, indem zunächst die Daten sortiert und spezielle Schlüsselwörter innerhalb des Datenschritts verwendet werden. Wenn ich zum Beispiel die Big Class-Datentabelle in SAS formatiert hätte und den ersten Jungen und das erste Mädchen alphabetisch auswählen wollte, würde das folgende Programm dies erreichen:
proc sort data = bigclass;
nach geschlechtsname;
Lauf;
Daten zuerst;
set bigclass;
nach geschlechtsname;
wenn first.sex;
Lauf;
Um den letzten Jungen und das letzte Mädchen alphabetisch auszuwählen, würde ich verwenden wenn last.sex; . Eine ähnliche Logik gilt, wenn ich in zusätzlichen Gruppen nach ersten und letzten auswählen möchte. Sagen wir, ich wollte für jeden Namen innerhalb des Geschlechts die kürzeste Person auswählen. Folgendes würde das tun:
proc sort data = bigclass;
nach Geschlecht Name Höhe;
Lauf;
Daten zuerst;
set bigclass;
nach Geschlecht Name Höhe;
if first.name;
Lauf;
Meine Kollegin Brady Brady war so freundlich, mir zu helfen, dieses Problem innerhalb von JSL zu lösen, indem Col Min () und Col Max () verwendet wurden. Abbildung 1 enthält einen Beispieldatensatz. Die ursprünglichen Daten enthielten nur Buchstaben (A bis J) und Buchstaben 2 (A bis D). Die Datentabelle wird nach diesen beiden Variablen sortiert. Unten sehen Sie, dass First.Letter für die erste Instanz jedes Buchstabens in Letter gleich 1 ist (sonst 0); Last.Letter ist eine 1 für die letzte Instanz jedes Buchstabens in Letter (sonst 0). Die Formeln für diese Variablen lauten wie folgt:
First.Letter = If (Row () == Col Minimum (Row (),: Buchstabe),
1
0
)
Last.Letter = If (Row () == Col Maximum (Row (),: Buchstabe),
1
0
)
Um diese Formeln zu interpretieren, verwenden die Funktionen von Col M ** imum (): Letter als Gruppe und erhalten die minimalen oder maximalen Zeilennummern in jedem Wert von Letter. Die If () - Funktion setzt First.Letter = 1, wenn die aktuelle Zeilennummer der folgenden entspricht: Briefspezifische minimale Zeilennummer. Wenn ein bestimmter Wert für: Letter nur eine einzige Zeile hat, wird dieser Datensatz sowohl als erster als auch als letzter Datensatz mit berücksichtigt Erster Brief = 1 und Last.Letter = 1

Abbildung 1. Datentabelle FirstLast
Ähnlich wie bei dem obigen Code für SAS kann dieser um mehrere Variablen erweitert werden. Angenommen, ich wollte die erste Instanz jedes Buchstabens von Letter2 auswählen innerhalb Brief, ich füge einfach eine zusätzliche Byvar zur Funktion hinzu.
First.Letter2 = If (Row () == Col Minimum (Row (),: Letter,: Letter2),
1
0
)
Last.Letter2 = If (Row () == Col Maximum (Row (),: Brief,: Letter2),
1
0
)
Diese Funktionen bieten eine nützliche Funktion, da Sie damit problemlos nach Gruppen sortieren können, in denen Duplikate auftreten. Zeilen auswählen, wo Erster Brief = 0 oder Letzter Buchstabe = 0 wählt alle Zeilen aus, in denen: Buchstabe wiederholt wird. Wenn Sie diese Funktionen im Zusammenhang mit der Klasse "Große Klasse" verwenden, können Sie mit: Höhe eine Untertabelle erstellen, in der bestimmte Höhen wiederholt werden können.
Beachten Sie, dass in SAS eine Sortierung erforderlich ist, um die speziellen first.XX last.XX-Variablen zu erstellen. Die obige Datentabelle ist zwar sortiert, dies ist jedoch keine Voraussetzung, damit der JSL-Code oben funktioniert.
Vielen Dank an Brady Brady für seine Hilfe!