Rufen Sie Spaltennamen ab, die einen bestimmten Wert habenHallo,
Ich habe gerade angefangen, JMP bei der Arbeit zu verwenden und zu versuchen, JSL zu lernen. Ich versuche, ein Skript zu schreiben, um die Spaltennamen abzurufen, bei denen der Zeilenwert = 1 ist. Die Tabelle zeigt beispielsweise Werte von 0 und 1 unter verschiedenen IMCX-Spalten und ich möchte herausfinden, welche Spalte in jeder Zeile den Wert =1 hat, und in einer neuen Spalte namens IMC speichern. In der ersten Zeile hat die Spalte IMC 4 den Wert 1, daher gebe ich IMC4 manuell unter IMC ein. Die Tabellen umfassen mehr als 5000 Zeilen. Danke für die Hilfe.

Automatisierung und SkripterstellungBetreff: Spaltennamen abrufen, die einen bestimmten Wert habenHallo Ian,
Nehmen Sie sich etwas Zeit und lesen Sie den Abschnitt „Hilfe“ > „Bücher“. Die Änderung des Schlüsselworts von „loc“ in „contains“ hat jetzt funktioniert. Vielen Dank!
// Get a list of the column names
colList = dt << getColumnNames( "String" );
// Get the '0's and '1's into a matrix
mat = dt << getAsMatrix;
// Value to search for
searchVal = 1;
// Add an 'expression' column and loop rowise . . .
newCol = dt << New Column( "Value " || Char( searchVal ) || " found in Column:", Expression );
for( r = 1, r <= N Row( dt ), r++,
newCol[r] = colList[Contains( mat[r, 0], searchVal )]
);Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenVielen Dank für Ihre Zeit und Hilfe. Ich konnte das Skript nicht erfolgreich ausführen. Es wurde eine IMC-Spalte erstellt, in der jedoch kein Wert enthalten war. Ich werde debuggen und versuchen, den Code besser zu verstehen.Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenHallo Ian, vielen Dank für deine Zeit und Erklärung. Ich kann deinen Code verstehen. Als ich jedoch das Skript ausführte, das dt als aktuelle Tabelle festlegte, wurde in der resultierenden Ausdrucksspalte empty() angezeigt. Ich habe hier noch einen langen Weg vor mir, um zu lernen. Vielen Dank an alle für eure Beiträge und VorschlägeBetreff: Spaltennamen abrufen, die einen bestimmten Wert habenVielen Dank für Ihre Zeit und Hilfe. Es tut mir leid, dass ich das Problem nicht klar dargelegt habe. In jeder Zeile gibt es nur eine Instanz von 1 unter einer Spalte und ich muss den Spaltennamen auswählen und unter einer neuen Spalte speichern.Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenVielen Dank. Es funktionierte!Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenHinsichtlich " Ich habe gerade angefangen, JMP bei der Arbeit zu verwenden und zu versuchen, JSL zu lernen „(und wurde bereits angedeutet) Es gibt viele Möglichkeiten, die Arbeit zu erledigen.
Finden Sie in diesem Sinne bitte noch eine weitere leichte Variation. Verwenden Sie „Hilfe > Bücher > Skripthandbuch“, um herauszufinden, wie es funktioniert.
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "IMCO", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IIMC2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ) ),
New Column( "IMC4", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IMC5", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC6", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ), Set Display Width( 46 ) ),
New Column( "IMC7", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC8", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC9", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC10", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC11", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
);
// Get a list of the column names
colList = dt << getColumnNames("String");
// Get the '0's and '1's into a matrix
mat = dt << getAsMatrix;
// Value to search for
searchVal = 1;
// Add an 'expression' column and loop rowise . . .
newCol = dt << NewColumn("Value "||Char(searchVal)||" found in Column:", Expression);
for (r=1, r<=NRow(dt), r++,
newCol[r] = colList[Loc(mat[r, 0], searchVal)];
);
Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenMeine Lösung (unter Verwendung derselben Beispieldatentabelle wie txnelson):
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "IMCO", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IIMC2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC4", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IMC5", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC6", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ), Set Display Width( 46 ) ),
New Column( "IMC7", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC8", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC9", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC10", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC11", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "RESIDUAL", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [32.3201037, 20.54947] ) ),
New Column( "TEST", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., .] ) )
);
//get wanted columns. Assumes that IMC columns start from column 1 and all IMC columns are one after another
colNames = dt << Get Column Names("String");
For(i = N Items(colNames), i > 0 , i--,
If(!Starts With(colNames[i], "IMC"),
Remove From(colNames, i),
break(); //we can break on first occurance
);
);
//new column with IMC with value 1
dt << New Column("IMC", Character,
<< Set Each Value(
rowValues = dt[Row(), 0][1::N Items(colNames)]; //get values of row as matrix
colIndex = Contains(rowValues, 1); //get index of
If(colIndex > 0, //handle
colNames[colIndex], //get column name with the index
""; //when no 1 found use ""
);
);
);Mir gefällt die erste Lösung @txnelson aus zwei (drei) Gründen angeboten:
- Es verwendet so viele Menüelemente, die direkt von JMP gefunden wurden, und Sie könnten es tun fast Erstellen Sie ein Skript ohne JSL-Kenntnisse, indem Sie es einfach aus datierbaren Quellen kopieren und einfügen
- Es verwendet bei allen eine sehr JSL-ähnliche Syntax << Wo auswählen und derartige
- (Ich denke, dass diese Art von Workflow, die in der Lösung dargestellt wird, sehr JMP-ähnlich ist)
Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenIch habe die anfängliche Eingabe so gelesen, dass mehr als eine Spalte in einer bestimmten Zeile den Wert 1 haben kann. Wenn dies nicht der Fall ist, sind die folgenden beiden Skripte nicht die zu verwendende Methode.
Hier ist eine Möglichkeit, dies zu tun
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "IMCO", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IIMC2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC4", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IMC5", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC6", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ), Set Display Width( 46 ) ),
New Column( "IMC7", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC8", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC9", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC10", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC11", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "RESIDUAL", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [32.3201037, 20.54947] ) ),
New Column( "TEST", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., .] ) )
);
// Generate a list of columns to be processed
colNamesList = dt << get column names(string);
remove from (colNamesList,13,2);
// Find the maximum( the ones ) for the columns in question
dtSum = dt<< Summary(
Max(colNamesList),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
// Stack all of the summarized columns
dtStack = dtSum << Stack(
columns(
colNamesList
),
Source Label Column( "IMC" ),
Stacked Data Column( "Data" )
);
close( dtSum, nosave );
// Delete all data that do not have 1
dtStack << select where(:Data !=1 );
dtStack << delete rows;
// Delete the unwanted columns from the summary table
dtStack << delete columns( {N Rows, data} );
// If there are more rows than in the original table, add rows
if( n rows( dt ) < N Rows( dtStack ),
dt << add rows( N Rows( dtStack ) - N Rows( dt ) )
);
// Add the column names for the columns found with 1's in their data
dt << Update( With( dtStack ) );
close( dtStack, nosave );

Hier ist eine zweite Möglichkeit: In diesem Beispiel haben mehr als eine Spalte in einer bestimmten Zeile den Wert 1
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "IMCO", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IIMC2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ) ),
New Column( "IMC4", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 0] ) ),
New Column( "IMC5", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC6", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1] ), Set Display Width( 46 ) ),
New Column( "IMC7", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC8", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC9", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC10", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "IMC11", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 0] ) ),
New Column( "RESIDUAL", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [32.3201037, 20.54947] ) ),
New Column( "TEST", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., .] ) ),
New Column( "IMC", Character, "Nominal", Set Values( {"IMC1", "IMC3"} ) )
);
// Generate a list of columns to be processed
colNamesList = dt << get column names( string );
Remove From( colNamesList, 13, 2 );
foundNamesList = {};
For( i = 1, i <= N Items( colNamesList ), i++,
theRows = dt << get rows where( As Column( colNamesList[i] ) == 1 );
If( N Rows( theRows ) > 0,
Insert Into( foundNamesList, colNamesList[i] )
);
);
dt << New Column( "IMC", character );
// If there are more rows than in the original table, add rows
If( N Rows( dt ) < N Items( foundNamesList ),
dt << add rows( N Items( foundNamesList ) - N Rows( dt ) )
);
If( N Items( foundNamesList ) > 0,
dt:IMC << set values( foundNamesList )
);

Betreff: Spaltennamen abrufen, die einen bestimmten Wert habenSie können so etwas tun:

Die Formel in der Ergebnisspalte lautet wie folgt:
If( :A == 0,
"",
Char( Column Name( 1 ) )
) || If( :B == 0,
"",
Char( Column Name( 2 ) )
) || If( :C == 0,
"",
Char( Column Name( 3 ) )
) || If(
== 0,
"",
Char( Column Name( 4 ) )
)
ich benutze verketten Schlüsselwort, um jede Spalte darauf zu überprüfen, ob es sich um eine 1 handelt.
Lassen Sie mich wissen, ob es für Sie klappt!
Betreff: Holen Sie sich Spaltennamen mit einem bestimmten WertHallo jthi,
wenn meine Daten wie in diesem Beispiel aussehen, aber alle Spalten numerisch sind (kontinuierliche Daten) und ich den Spaltennamen mit einem Cut-off wie z. B. > 3000 auswählen möchte (in einer Zeile können mehrere Spalten > 3000 sein), was muss ich im Skript tun?
Ich verwende das folgende Skript
colNames = dt << Spaltennamen abrufen ( "String" );
Für (i = N Elemente (colNames), i > 3000 , i--,
);
aber es hat nicht funktioniert.
Am besten