Seleziona le righe in una tabella dati utilizzando le righe di un'altraCiao comunità JMP,
Ho due diverse tabelle dati in cui condividono una colonna in comune, Numero di lotto (Lotto in breve). (Esecuzione di JMP Pro 14.1.0 su W10)
Le tabelle dati provengono da due origini diverse e contengono un numero diverso di righe. Voglio utilizzare una delle tabelle dati per selezionare le righe corrispondenti nell'altra tabella dati. I valori in Lotto sono continui/numerici. dt1 ha 1430 righe e dt2 ne ha 158. Ci sono più lotti in dt1 che dt2, quindi devo usare dt2 per selezionare solo i lotti corrispondenti in dt1.
Pensavo di poter fare un semplice: dt1<
Penso di poterlo fare utilizzando due cicli for, dove per ogni riga in dt1, passerebbe attraverso dt2 per vedere dove sono uguali, sfortunatamente questo si traduce in 225940 confronti, che pensavo sarebbe stato facile, ma sta impiegando JMP molto più a lungo di quanto immaginassi.
Questo è il codice di selezione che ho scritto:
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>Ma non funziona. Sembra essere intrappolato in un ciclo infinito (ho dovuto forzare l'uscita da JMP).
Ho letto un po' mentre scrivevo questo post e, poiché devo mantenere tutte le righe selezionate in precedenza, devo richiamare l'opzione Selezione corrente("estendi"). Quindi, so sicuramente che il codice sopra non funzionerà, ma avrebbe dovuto fare qualcosa.
Ci deve essere un modo più veloce per farlo rispetto a For Loops, qualcosa di più elegante.
Qualsiasi feedback è molto apprezzato.
Grazie!,
DS
Ri: Selezionare le righe in una tabella dati utilizzando le righe di un'altraCIAO @txnelson ,
Ho provato il secondo e ha funzionato benissimo! Grazie per la soluzione
DSRi: Selezionare le righe in una tabella dati utilizzando le righe di un'altraEcco 2 modi per farlo.Il primo metodo utilizza il tuo approccio, tuttavia sarà lento con tabelle di dati di grandi dimensioni
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" )
)
);
Il secondo funzionerà in modo più efficiente
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" );