So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzHallo zusammen, ich habe 2 Datentabellen. Meine Datensatztabelle „Dataset.jmp“ hatte die Spaltendaten als Code „ENICITY“ und „ETHCAT“, die ich mit dem Datensatz „Dictionary.jmp“ verknüpfen muss, der den Code in Beschriftungen ändern kann (in der Beschriftungsspalte der Dictionary-Datei). Mein aktueller Datensatz hatte 50 Kategorien, daher kann ich die Funktion „Wertbeschriftungen“ nicht für alle Kategorien verwenden. Irgendeine Idee, wie man die Zeile einer Tabelle mit der Spalte einer anderen Tabelle mit dem genauen Wert verknüpft? Die gewünschte Spalte ist die Ergebnisspalte in der Datei Dataset.jmp
Ich habe die Dateien hier angehängt.
Vielen Dank!
Am besten,
Grundlegende Datenanalyse und ModellierungBetreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzMit matchf müssen Sie nur die Spalten auflisten, bei denen es eine Änderung gibt, die restlichen Spalten bleiben „col“ – letzter Eintrag.
Wenn Sie keine Zuordnung erstellen möchten, verwenden Sie einfach übereinstimmende Namen für die Spalten und das Wörterbuch.
Alternativ verwenden Sie eine konsistente Zuordnung (z. B.: erstes Zeichen des Spaltennamens oder erste 2 Zeichen) und eine entsprechende Gleichung.
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzVielen Dank, Hogi. Können Sie jedoch das Skript bereitstellen, bei dem nicht alle vorhandenen Spalten (mehr als 50 Spalten) neu eingegeben werden müssen?
Danke !
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzAls weitere Alternative - ohne Untergruppen/For Each:
names default to here(1);
dict = Open( "$DOWNLOADS/Dictionary1.jmp" );
dt = Open( "$DOWNLOADS/Dataset1.jmp" );
// stack the data for easy application of the dictionary
dt2=dt << Stack(
columns(
:ETHNICITY, :ETHCAT, :SEX, :NAME, :"A09:05"n, :"A01:01"n, :DPA05, :DPB04
),
Source Label Column( "col" ),
Stacked Data Column( "values" )
);
// add a column with the corrected column-identifiers
dt 2 << New Column( "column",
Character,
Formula(
Match( :col,
"A01:01", "A",
"A09:05", "A",
"DPA05", "DP",
"DPB04", "DP",
:col
)
)
);
<BR />// add the labels from the disctionary
dt2 <<
Update(
With( dict ),
Match Columns( :column = :Column, :values = :Values ),
Add Columns from Update Table( :Labels )
);<BR />
// convert back to a wide table
dt2 <<
Split(
Split By( :col ),
Split( :Labels ),
Group( :ID ),
Remaining Columns( Drop All )
);
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzFügen Sie in diesem Fall einfach eine Zuordnung hinzu, um die richtige Teilmenge zu erhalten, z. B. im Jarmos-Code:
colMapping = Associative array({{"SEX","SEX"},{"NAME","NAME"},{"A09:05","A"},{"A01:01","A"},{"DPA05","DP"},{"DPB04","DP"}});
colIndex= colMapping[col];
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == colIndex)), Selected Columns(0), Invisible);
Alternative Idee: Es gibt eine Funktion in Recode, die dem, was Sie wollen, ziemlich nahe kommt: Mapping aus Tabelle anwenden


Momentan gibt es keine Einstellung, um die richtige Teilmenge anzugeben. Wenn Sie also solche Zuordnungen regelmäßig verwenden - und andere Benutzer tun das auch -, möchten Sie vielleicht einen Wunsch in der Wunschliste posten, um die Funktion um eine solche Einstellung zu erweitern ...
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzVielen Dank, Jim und Jarmo,
Ich lerne viel aus der Diskussionsgemeinschaft. Vielen Dank für Ihre Hilfe. Ich habe versucht, Themen zu finden, die mit dem zusammenhängen, was ich tun möchte, und habe die Antworten von dieser Gemeinschaft erhalten. Die Skripte, die JIM und Sie mir geben, funktionieren. Meine tatsächlichen Daten sind jedoch komplizierter als die Beispiele. Beispielsweise wenn ich dasselbe Wörterbuch mit mehreren Spalten im Datensatz verwende, wie ich den neuen Datensatz1 und das neue Wörterbuch1 angehängt habe. Können Sie das Skript dafür korrigieren, wenn 1 Spalte mit anderen Spalten im gleichen Muster geteilt wird? Wie Wörterbuch A und Spalten A01, A08, A9, …
Ich habe den neuen Datensatz hier angehängt.
Am besten,
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzIch würde auf jeden Fall mit der Lösung beginnen, die Jim bereitgestellt hat, da sie mehr von dem von JMP bereitgestellten JSL nutzt, aber dies ist etwas, das ich nach umfassender Erfahrung mit JSL und JMP schreiben würde (ein Teil meiner Arbeit besteht darin, JMP mit Skripten zu automatisieren und mit JSL zusätzliche Funktionen zu JMP hinzuzufügen …)
Mehr anzeigen...
Names Default To Here(1);
dt_data = Open("$DOWNLOADS/Dataset.jmp");
dt_dict = Open("$DOWNLOADS/Dictionary.jmp");
Column(dt_dict, "Values") << Set Data Type("Numeric");
/*
// Not really sure if this "fix" should be done or not
missing_rows = Loc(dt_dict[0, "Values"], .);
If(N Rows(missing_rows) > 0,
dt_dict[missing_rows, "Values"] = 0;
);
*/
Summarize(dt_dict, cols = By(:Column));
For Each({col}, cols,
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == col)), Selected Columns(0), Invisible);
Column(dt_dict_subset, "Labels") << Set Name("Result " || col);
dt_data << Update(
With(dt_dict_subset),
Match Columns(Eval(col) = :Values),
Add Columns from Update Table(Eval("Result " || col))
);
Close(dt_dict_subset, no save);
);
Write();
Zunächst sollten Sie die von Jim bereitgestellte Option vollständig verstehen. Dann können Sie vielleicht darüber nachdenken , so etwas zu verwenden (wenn Sie einigermaßen gut mit Programmierung vertraut sind), da hierdurch im Grunde der Großteil des Codes übersprungen wird , den JMP Ihnen bieten kann (die meisten Open()- und << Update-Funktionen werden von JMP bereitgestellt).
Springen Sie nicht direkt zu meiner Lösung, bevor Sie die vorherigen Schritte durchlaufen haben , wenn Sie JSL lernen und wissen möchten, wie man JMP automatisiert
- Beginnen Sie mit ausschließlich JMP-basierten Skripten
- Verbessern Sie sie leicht (nutzen Sie beispielsweise Variablen anstelle von „fest codierten“ Tabellennamen).
- Beginnen Sie damit, etwas „Programmierung“ in die Mischung einzubringen. Hier würde ich Jims Lösung einordnen (zum Beispiel eine Schleife, die JMP Ihnen höchstwahrscheinlich nicht bieten kann, und die Verwendung der Word()-Funktion).
- Am Ende habe ich so etwas wie meine Lösung, die immer noch teilweise das von JMP bereitgestellte JSL verwendet (Tabellen öffnen, Tabelle aktualisieren).
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzHier ist ein guter Ausgangspunkt für Ihre Wünsche. Sie sollten in der Lage sein, diese zu erweitern, um etwaige Abweichungen in Ihren endgültigen Anforderungen zu berücksichtigen.
Wenn Sie sich noch nicht die Zeit genommen haben, den Scripting Guide zu lesen, der in der JMP-Hilfe verfügbar ist, empfehle ich Ihnen dringend, dies zu tun. Sehen Sie sich auch unbedingt das folgende Beispiel an, damit Sie die Logik und die Besonderheiten der Funktionen und Anweisungen verstehen.
names default to here(1);
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
dt = Open( "$Downloads/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
dtDict = Open( "$Downloads/Dictionary.jmp" );
/*// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );*/
// Change column modeling type: Values
Data Table( "Dictionary" ):Values << Set Modeling Type( "Continuous" );
// Create a new dictionary data table for each level of the Column column
dtDictList = dtDict << Subset(
By( :Column ),
All rows,
Selected columns( 0 ),
Selected rows( 0 )
);
/*// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );*/
// Clear row selection
//Data Table( "Dataset.jmp" ) << Clear Select;
dt << Clear Column Selection();
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
/*// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );*/
For Each( {thedt, index}, dtDictList,
// Get the dataset column to join with
joinColumn = Word( 3, Char( thedt ), "=\!"" );
// Join data tables
// → Data Table( "untitled 1925" )
newDT = dt << Join(
With( thedt ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( Column( joinColumn ) = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Join of Dataset with Column=ETHCAT" )
);
NewDt:Labels << set name( joinColumn || " Labels" );
NewDt:Values << set name( joinColumn || " Values" );
If( index > 1,
Close( dt, nosave )
);
dt = newDT;
);Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzHallo Jim, vielen Dank. Ihre Vorschläge funktionieren gut. Ich habe jedoch ein Wörterbuch mit 150 Zeilen mit unterschiedlichen Kategorien (verschiedene 5 bis 30 Gruppen, wie ETHCAT, ETHNICITY usw.) und eine Spalte in der Datensatztabelle, die mit 300 Spalten verknüpft werden muss. Ehrlich gesagt ist das manuell schwer zu machen und ich habe mehrere Tabellen, die miteinander verknüpft werden. Können Sie das Skript zu 1. bereitstellen. Wie kategorisiere ich dasselbe in einer Wörterbuchdatei und wie verknüpfe ich alle Datensatzspalten mit einer Wörterbuchdatei? Dies ist das Skript, das ich zu erstellen versuche. Ich kann die Skripte jedoch nicht ändern.
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
Open( "$DOWNLOADS/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
Open( "$DOWNLOADS/Dictionary.jmp" );
// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Change column info: Values
Data Table( "Subset of Dictionary 2" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Clear row selection
Data Table( "Dataset.jmp" ) << Clear Select;
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );
// Join data tables
// → Data Table( "untitled 1925" )
Data Table( "Dataset.jmp" ) << Join(
With( Data Table( "Subset of Dictionary 2" ) ),
By Matching Columns( :ETHCAT = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
Vielen Dank,
Am besten,
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzWarum sollte die Anzahl der Zeilen und Spalten ein Problem darstellen? Wenn die Anzahl der verschiedenen Nachschlagevorgänge (ETHCAT, ETHNICITY usw.) größer ist, müsste die Teilmenge und Zusammenführung einfach in eine Schleife eingefügt werden. Der Anfang besteht jedoch darin, dies interaktiv für 1 oder 2 Gruppen durchzuführen und dann das von JMP erstellte JSL zu nehmen, um diese Vorgänge durchzuführen, und sie in ein Skript einzufügen. Dann kann die Schleife der Schritte zum Skript hinzugefügt werden.
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzSie könnten virtuelle Verknüpfungen über die Spalteneigenschaften verwenden.
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzHallo Jim, danke für deine Idee. Ich habe jedoch mehr als 50 Spalten und 1000 Zeilen. Hast du eine Idee für einen größeren Datensatz?
Am besten,
Betreff: So verknüpfen Sie den Spaltencode einer Tabelle mit einem anderen TabellendatensatzSchauen Sie in
Tabellen=>Verbinden
Teilmenge der Datentabelle Dictionary durch die Spalte „Column“ in eine Tabelle für ETHCAT und eine für ETHNICITY. Ändern Sie die Spalte „Value“ in eine numerische Spalte. Für die Datentabelle ETHNICITY muss „Null“ oder „Missing“ in zwei Zeilen mit dem Wert „Value“ und einer mit dem Wert „0“ erweitert werden.
Verbinden Sie jede der untergeordneten Tabellen mit der Datentabelle namens „Dataset“, indem Sie ETHNICITY mit „Value“ für die eine Tabelle und ETHCAT mit „Value“ für die zweite Tabelle verbinden.