Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Wenn ich eine Datentabelle habe, die ich in verschiedene Spalten aufteile, werden alle Spalten erwartungsgemäß mit dem Datentyp „Zeichen“ ausgegeben.
Gibt es nun eine Möglichkeit, ein JSL-Skript zu schreiben, um automatisch neu zu beurteilen, ob der Datentyp numerisch oder zeichenhaft sein soll? Wenn festgestellt wird, dass es sich bei der Dateneingabe um Zahlen handelt, den Datentyp in „Numerisch“ ändern?
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Ein Ansatz wäre, die Anzahl der fehlenden Werte zu zählen, eine Liste der Werte zu erstellen, die Spalte auf „Numerisch“ umzustellen und dann die Anzahl der fehlenden Werte erneut zu zählen. Wenn die Anzahl der fehlenden Werte vorher und nachher gleich ist, haben Sie eine numerische Spalte. Wenn nicht, ändern Sie es zurück und ersetzen Sie die Werte durch die Kopie.
Dies würde jedoch fehlschlagen, wenn ein nicht numerischer Wert wie NA in einer numerischen Spalte erscheint.
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Ich habe keine Lösung gefunden, aber eine andere Möglichkeit wäre, einen regulären Ausdruck zu verwenden, um zu bestimmen, ob jede Spalte nur Zahlen- und Punktzeichen (Dezimalzeichen) enthält. Das folgende Beispiel nimmt jede Spalte, verkettet alle ihre Werte zu einer großen Zeichenfolge und prüft dann, ob diese Zeichenfolge Zeichen enthält, die keine Zahl oder ein Dezimalpunkt sind ( [^0-9\.] ). Wenn in der gesamten Spalte nur Zahlen und Dezimalstellen gefunden werden (d. h. „Contains Item“ wird mit Null ausgewertet), wird der Datentyp auf „Numerisch“ festgelegt.
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Wenn Sie keine automatisierte Lösung benötigen, gibt es in Recode die Option „Als Zahlen analysieren“ mit einem roten Dreieck. Es ändert jeden nicht numerischen Eintrag (wie NA) in einen fehlenden Wert.
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Ein potenzielles Problem bei diesem Ansatz besteht darin, dass er keine wissenschaftliche Notation unterstützt. Die Änderung der Regex, um wissenschaftliche Schreibweise und Verneinungen zu akzeptieren, während Dinge wie Telefonnummern und Sozialversicherungsnummern abgelehnt werden, macht sie deutlich (hah! Wortspiel!) komplexer.
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Dies ist der Ansatz, den ich empfehle. Abhängig von den Daten, die wahrscheinlich angetroffen werden, habe ich außerdem Folgendes getan:
1) Verwenden Sie zur Steigerung der Effizienz nur die ersten k Zeilen jeder Spalte, um die Entscheidung zu treffen.
2) Erlauben Sie einen bestimmten Prozentsatz (nach Bedarf anpassen) der fehlenden Werte in einer bestimmten Spalte (oder ihrer Teilmenge). Unterhalb dieses Schwellenwerts sollten Sie trotzdem in eine numerische Zahl konvertieren.
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Neben den bereits erwähnten Komplikationen berücksichtigt die Lösung auch Kommas als Dezimalstellenhalter oder als numerische Trennzeichen für Tausender. Auf diese Weise könnte es auch eine internationalere Lösung sein.
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Guter Punkt (und Wortspiel), Brady. Diese Regex-Lösung funktioniert für die gut funktionierenden Beispieldaten, lässt sich jedoch nicht auf alle möglichen Daten verallgemeinern. Ich kann mir vorstellen, dass es einen Master-Regex gibt, der die Arbeit erledigen könnte, aber es könnte mühsam sein, ihn zu entwickeln. Alternativ könnte man jede einzelne Zeile in einer Spalte mit einer oder mehreren einfacheren „Contains Item“-Prüfungen durchlaufen; Beispielsweise könnte man einen Anfangsstrich zulassen (für negative Zahlen), aber alles ablehnen, was nicht-Anfangsstriche enthält, und ein anderer könnte prüfen, ob die Zeile der wissenschaftlichen Notation entspricht. Wenn alle Prüfungen für alle Zeilen in einer Spalte erfolgreich sind, ändern Sie den Datentyp. Wie Sie sagen, „deutlich“ komplexer.
Betreff: Gibt es eine Möglichkeit, den Datentyp automatisch neu zu bewerten?Ich komme etwas zu spät zur Party, aber eine „betrügerische“ Möglichkeit besteht darin, die Datei als CSV zu exportieren und dann erneut zu importieren, wobei JMP beim Öffnen automatisch die Spaltentypen ermittelt. Dies setzt jedoch voraus, dass Sie keine Tabellenskripte oder Spalteneigenschaften speichern müssen. Hier ist ein Skript.
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");