Wählen Sie Zeilen in einer Datentabelle aus, indem Sie Zeilen aus einer anderen verwendenHallo JMP-Community,
Ich habe zwei verschiedene Datentabellen, in denen sie eine gemeinsame Spalte haben: Losnummer (kurz Los). (Läuft JMP Pro 14.1.0 auf W10)
Die Datentabellen stammen aus zwei verschiedenen Quellen und enthalten eine unterschiedliche Anzahl von Zeilen. Ich möchte eine der Datentabellen verwenden, um die passenden Zeilen in der anderen Datentabelle auszuwählen. Die Werte in Lot sind kontinuierlich/numerisch. dt1 hat 1430 Zeilen und dt2 hat 158. Es gibt mehr Lose in dt1 als in dt2, daher muss ich dt2 verwenden, um nur die passenden Lose in dt1 auszuwählen.
Ich dachte, ich könnte ein einfaches tun: dt1<
Ich denke, ich kann es mit zwei for-Schleifen machen, wobei für jede Zeile in dt1 dt2 durchlaufen wird, um zu sehen, wo sie gleich sind. Leider führt dies zu 225940 Vergleichen, was meiner Meinung nach einfach wäre, aber JMP viel länger dauert als ich es mir vorgestellt habe.
Dies ist der Auswahlcode, den ich geschrieben habe:
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>Aber es funktioniert nicht. Es scheint in einer Endlosschleife gefangen zu sein (musste das Beenden von JMP erzwingen).
Ich habe beim Schreiben dieses Beitrags ein wenig gelesen und da ich alle zuvor ausgewählten Zeilen behalten muss, muss ich die Option „Aktuelle Auswahl“ („erweitern“) aufrufen. Ich weiß also definitiv, dass der obige Code nicht funktionieren wird, aber er hätte etwas bewirken sollen.
Es muss eine schnellere Vorgehensweise geben als For-Schleifen, etwas Eleganteres.
Wir freuen uns über jedes Feedback.
Danke!,
DS
Betreff: Wählen Sie Zeilen in einer Datentabelle aus, indem Sie Zeilen aus einer anderen verwendenHallo @txnelson ,
Ich habe das zweite ausprobiert und es hat großartig funktioniert! Danke für die Lösung.
DSBetreff: Wählen Sie Zeilen in einer Datentabelle aus, indem Sie Zeilen aus einer anderen verwendenHier sind zwei Möglichkeiten, dies zu tun.Die erste Methode verwendet Ihren Ansatz, ist jedoch bei großen Datentabellen langsam
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
Der zweite wird effizienter arbeiten
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );