eine Spalte klonen<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo alle,
Ich möchte eine Spalte in der Datentabelle klonen (eine neue identische Spalte bis auf den Namen erstellen). Gibt es eine elegantere (und robustere) Möglichkeit, dies zu tun, oder muss ich die Werte und alle Eigenschaften extrahieren und sie der neuen Spalte als solche zuweisen:
dt3 = Offen ( „$SAMPLE_DATA/Cars.jmp“ ) ;
// eine Spalteneigenschaft hinzufügen
dt3 : Machen << Eigenschaft festlegen (
„Wertfarben“ ,
{ „Acura“ = - 13977687 , „Audi“ = - 3780931 , "BMW" = - 4222943 , „Buick“ = -
13596966 , „Cadillac“ = - 2211217 , „Chevrolet“ = - 10562780 , „Chrysler“ = -
13156647 , „Daihatsu“ = - 2078390 , "Ausweichen" = - 13182413 , "Adler" = - 9549600 ,
"Ford" = - 2334147 , „Geo“ = - 13772446 , „Honda“ = - 9282864 , „Hyundai“ = -
6995852 , „Infiniti“ = - 1524612 , „Isuzu“ = - 9458080 , "Jeep" = - 14452073 ,
„Lexus“ = - 6391856 , „Lincoln“ = - 2745505 , „Mazda“ = - 10199751 , "Mercedes" =
- 7150697 , "Quecksilber" = - 10513726 , „Mitsubishi“ = - 8381519 , „Nissan“ = -
3502441 , „Oldsmobile“ = - 3615440 , „Peugeot“ = - 13925307 , „Plymouth“ = -
11502354 , „Pontiac“ = - 7449196 , „Renault“ = - 9229791 , „Saab“ = - 4074344 ,
"Saturn" = - 13050224 , „Subaru“ = - 12565885 , „Suzuki“ = - 2068529 , „Toyota“ =
- 4494272 , "Volkswagen" = - 11824110 , „Volvo“ = - 8734293 , „Yugo“ = - 13849421 }
) << Zelle nach Wert einfärben ;
// die Spalte klonen
clone_column = dt3 : Machen << Holen Sie sich das Skript ;
clone_column ;
Betreff: Eine Spalte klonenNein, diese Interpretation ist völlig falsch.
Die Skripterstellung für JMP umfasst normalerweise die Verwendung integrierter JMP-Objekte wie Datentabellen, Datenspalten oder Analyseplattformen. Sie verwenden diese Objekte, indem Sie eine Nachricht an das Objekt senden, die die gewünschte Aktion angibt. Die allgemeine Form wird hier in beiden Versionen gezeigt: unter Verwendung der eigentlichen JMP-Funktion und unter Verwendung des entsprechenden Operators.
Send( object, message );
object << message;
Das Objekt wird durch einen Referenzwert repräsentiert. Die Nachricht wird durch den Namen dargestellt. Dieses Beispiel wird wie folgt interpretiert:
dt3:Make << Get Script
Senden Sie die Nachricht Holen Sie sich das Skript auf das Objekt, auf das Bezug genommen wird dt3:Machen . Diese Referenz verwendet das Formular Tabelle:Spalte . In der Variablen wurde zuvor ein Verweis auf eine Datentabelle gespeichert dt3 . Der Verweis auf die Spalte erfolgt namentlich.
Die Nachricht Holen Sie sich das Skript kann an jedes JMP-Objekt gesendet werden. Die „Getter“-Methode hinter dieser Nachricht wird von jedem Objekt überschrieben, um das Skript zurückzugeben, das das ursprüngliche Objekt neu erstellt. Das heißt, es gibt den Code zurück, der das Objekt klont. Sie können also immer dieselbe Nachricht verwenden, um den eindeutigen Code für jedes Objekt zu erhalten.
Betreff: Eine Spalte klonenDanke für die Erklärung und die schnelle Antwort. Ich vermute, dass Get der Name des Skripts ist, das in jmp integriert ist und ausgeführt wird. Wie könnte es sonst wissen, dass die Spalte geklont werden muss, anstatt einen anderen Vorgang auszuführen? Ich habe viel aus Ihrer Antwort gelernt.
Betreff: Eine Spalte klonenLassen Sie es uns in der Reihenfolge ausarbeiten, in der der Ausdruck ausgewertet wird.
dt3:Make << Get script
Die Nachricht führt dazu, dass JMP den JSL-Code zurückgibt, der dieselbe Spalte erstellen würde.
Eval(dt3:Make << Get script)
Der JSL-Code wird ausgewertet, was zu einer neuen Datenspalte führt, die eine Kopie der ursprünglichen :Make-Spalte ist. Die Funktion Eval() gibt auch einen Verweis auf diese neue Spalte zurück.
Eval(dt3:Make << Get script) << set name("Clone");
Senden Sie abschließend der neuen Spalte die Nachricht, den Namen der neuen Spalte mithilfe der Objektreferenz zu ändern.
Betreff: Eine Spalte klonenHallo MS, würde es Ihnen etwas ausmachen, zu erklären, wie dieser Befehl die ausgewählte Spalte in einem dt klont? Eval(dt3:Make << Get script) << set name("Clone"); Mir ist klar, dass dies normalerweise nicht die Art von Frage ist, die hier gestellt wird, und zwar vor 5 Jahren, aber dies ist der undurchsichtigste Befehl, den ich je in einer Programmiersprache gesehen habe, die ich verwendet habe. Bei mir klappt es aber super!Betreff: Eine Spalte klonenDanke MS ,
Es stimmt, dass Farben an einem privaten Tisch nicht sehr nützlich sind.
Die Sache ist, dass ich einen Algorithmus schreibe, der auf einem heuristischen Prozess basiert. Das bedeutet, dass ich ein Skript benötige, das das tun würde, was ich tun würde, wenn ich die Datenzeilen einzeln „lesen“ und interpretieren müsste (hier brauche ich die Farben). Andererseits muss das Skript beim Ausführen schnell sein, sodass ich zwischen Tabellen, die ich sehe, und schnell laufenden (privaten) hin und her springen muss. Dieser Übergang zwischen visuellen und privaten Tabellen bringt Robustheitsprobleme mit sich, wenn Skripts für einige wenige offene Tabellen erstellt werden.
Ron
Betreff: Eine Spalte klonenIch bin mir wirklich nicht sicher, welchen Wert es hat, Spalteneigenschaften wie Wertefarben in einer privaten Tabelle beizubehalten.Wenn für Sie nur die Daten wichtig sind (normalerweise bei privaten Tabellen), könnte die einfachere Methode unten verwendet werden:
dt3 << Neue Spalte ( „Klon erstellen“ , Formel ( dt3 : Machen ))
Betreff: Eine Spalte klonenDanke Dave@Pega-Analytics txnelson ,
Das ist es, wonach ich gesucht habe. Ich hätte nicht erwartet, dass das Duplizieren einer Spalte so umständlich sein würde.
Das Folgende ist mein endgültiges Skript:
Namen standardmäßig hier ( 1 ) ;
dt3 = Offen ( „$SAMPLE_DATA/Cars.jmp“ , Privatgelände ) ;
// In dieselbe Tabelle klonen
Bewertung ( Analysieren ( „(dt3<<“ || verkohlen ( dt3 : Machen << Holen Sie sich das Skript ) || ") << set name(\!"Clone\!");" )) ;
// Beweis, dass die Spalte geklont wurde – Protokoll prüfen
dt3 : Klon << Holen Sie sich das Skript ;
schließen ( dt3 , kein Speichern ) ;
am besten,
Ron
Betreff: Eine Spalte klonenHier ist ein vollständiges Beispiel für eine Möglichkeit, den Datentabellenzeiger voranzustellen:
Eval(Parse("(dtxxx<<"||char(dt3:Make << Get script)||") << set name(\!"Clone\!");"));
Betreff: Eine Spalte klonenSie können es robuster machen, indem Sie die Skriptvariable vor der Auswertung bearbeiten, dh dem Ausdruck „dt <<“ voranstellen.
Betreff: Eine Spalte klonenDas Robustheitsproblem trat bei der Verwendung privater Tabellen auf, da der Klon an eine andere Tabelle gesendet wurde, die nicht privat war.
Betreff: Eine Spalte klonenDanke MS ,
Ich bin überrascht, dass es keinen JSL-Befehl zum Duplizieren einer vorhandenen Spalte gibt. Wenn dt3 außerdem nicht die aktive Tabelle ist, wird die neue Spalte in einer anderen Tabelle erstellt.
Betreff: Eine Spalte klonenDas sieht für mich sehr schick aus. Hatten Sie Probleme mit der Robustheit?
Wenn Sie keinen Speicher für eine Variable verschwenden möchten, können Sie sie int vereinfachen oa Oneliner:
Bewertung ( dt3 : Machen << Holen Sie sich das Skript ) << Name einsetzen ( "Klon" ) ;
Zum Klonen mehrerer Spalten würde ich in Betracht ziehen, eine Teilmenge davon zu erstellen, die Spalten umzubenennen und mit der ursprünglichen Datentabelle zu aktualisieren.