Mantieni le colonne corrispondenti a un elenco, rimuovi il restoCIAO -
Vorrei rimuovere le colonne (in base ai nomi delle colonne) da una tabella dati che lo fa non corrispondere a un elenco. Finora ho seguito il codice JSL ma non funziona.
Ingresso apprezzato.
Names Default To Here( 1 );
bigClass = Open( "$SAMPLE_DATA/Big Class.JMP" );
dt = Current Data Table();
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names( String );
For(j = 1, j <= N Items( col_of_interest ), j++,
For( i = N Items( col_names ), i > 0, i--,
if ( not( col_names[i] == col_of_interest[j],
Remove From( col_names, i ))
);
);
);
dtNew = dt << subset( all rows, columns( col_names ) ); Wait( 0 );
Ingegneria della qualità e dei processifinestreRe: Mantieni le colonne corrispondenti a un elenco, rimuovi il restoDi fatto, JMP non confonderà la variabile j e la funzione J() perché quando si utilizza il nome di una funzione, deve essere seguito dalle parentesi, altrimenti avrà un ambito diverso, come una variabile se quel nome esiste.
Ma prendo sul serio il tuo avvertimento in generale perché i nomi sono importanti in JSL!
Re: Mantieni le colonne corrispondenti a un elenco, rimuovi il restoUn'altra opzione se si utilizza JMP 16:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.JMP" );
//list of columns to include
col_of_interest = {"name", "age", "weight", "does not exist"};
// Option 1 - subset table
// Filter out columns in the list that aren't in the table and subset
cols_checked = filter each({cn}, dt << Get Column Names( String ), n items(loc( col_of_interest, cn ))>0);
dtNew = dt << subset( all rows, columns( cols_checked ) );
// Option 2 - delete columns from original table
for each({c}, dt << get column references, if( n items( loc( col_of_interest, c << get name ) ) == 0, dt << delete columns(c) ) );Re: Mantieni le colonne corrispondenti a un elenco, rimuovi il restoGrazie per il contributo e il suggerimento sulla funzione matrice J, jthi. Fammi riprovare.
Re: Mantieni le colonne corrispondenti a un elenco, rimuovi il restoQuando si confrontano due elenchi, trovo più semplice creare un terzo elenco per contenere i risultati mentre si lavora sui cicli e quindi utilizzare il terzo elenco per agire quando tutto il ciclo è completo.Il codice seguente potrebbe realizzare ciò che stai tentando.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.JMP" );
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names( String );
col_list = {};
For( i = N Items( col_names ), i > 0, i--,
if(contains(col_of_interest, col_names[i]),
insert into(col_list, col_names[i])
);
);
dtNew = dt << subset( all rows, columns( col_list ) );
Wait( 0 );
Re: Mantieni le colonne corrispondenti a un elenco, rimuovi il restoVorrei eseguire il loop su tutte le colonne nella tabella dati e rimuoverle quando necessario (se vuoi mantenere la tua idea, posso anche aiutarti a eseguire il debug):
Names Default To Here(1);
bigClass = Open("$SAMPLE_DATA/Big Class.JMP");
dt = Current Data Table();
col_of_interest = {"name", "age", "weight"};
col_names = dt << Get Column Names(String);
For(i = 1, i <= N Items(col_names), i++,
If(!Contains(col_of_interest, col_names[i]),
dt << Delete Columns(col_names[i]);
);
);
Wait(0);Inoltre suggerirei di non utilizzare J come nome di variabile, poiché JMP ha una funzione di matrice J().
Modificare:
Inoltre non è necessario utilizzare Current Data Table() (e non dovresti) perché hai già il riferimento dopo aver aperto la tabella. Inoltre ecco il mio metodo preferito per rimuovere le colonne (usando l'array associativo per ottenere solo le colonne extra e rimuovendole):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.JMP");
col_of_interest = {"name", "age", "weight"};
//get columns which are "extra"
col_names_aa = Associative Array(dt << Get Column Names(String));
col_names_aa << Remove(Associative Array(col_of_interest));
col_names_to_remove = col_names_aa << get keys;
Show(col_names_to_remove);
dt << Delete Columns(col_names_to_remove);