Eliminazione di colonne con N valori di riga nullHo una tabella di valori in cui ogni colonna è uno strumento e ogni riga è un tempo. Alcuni strumenti non hanno registrato dati a valori temporali sufficienti per consentirmi di adattare un modello significativo.
Sto tentando di utilizzare un ciclo per permettermi di scorrere ogni colonna a turno e controllare il numero di valori.
Ho del codice che trova il numero di valori per la colonna 80.
col_a = Column(dt_2, 80);
val_mat = col_a << Get Values;
y = sum(!is missing(val_mat));
Sto tentando di adattare questo codice in un ciclo per ogni colonna a turno ed eliminare le colonne con valori troppo pochi.
N_loop = N Cols(dt_2);
i_loop = 2;
While (i_loop <= N_loop,
col_loop = Column(dt_2, i_loop),
val_loop = col_loop << Get Values,
y_loop = sum(!is missing(val_loop)),
If(y_loop <= 8,
dt_2 << Delete Columns( i_loop ),
);
i_temp+=1,
);
Il messaggio di errore indica troppi argomenti.
finestreOggetto: eliminazione di colonne con N valori di riga nulliIl motivo per cui ci sono troppi argomenti è che c'è una seconda virgola nella funzione While().
La struttura di una funzione While() è
While( testExpr, bodyExpr )
Nota: ci sono solo 2 argomenti per la funzione.Il test
i_loop <= N_loop
e quindi le istruzioni che vengono eseguite se textExpr è vero.Il tuo bodyExpr ha virgole dopo ogni istruzione, piuttosto che punti e virgola.Pertanto, rendendo ogni affermazione un argomento separato.
Si prega di non modificare semplicemente le virgole in punti e virgola ed eseguire questo codice.C'è un errore logico, che non permetterà al codice di finire mai.i_loop e N_loop non cambiano mai di valore.
Esiste anche un modo più rapido per verificare il numero di valori validi in una colonna.Inoltre, se elimini colonne e il tuo valore N_loop rimane fisso, N_loop non è più il numero corretto di colonne nella tabella dati, una volta eliminata una colonna.In questi casi è meglio lavorare dall'ultima colonna alla prima colonna.
Di seguito è riportata una rielaborazione del tuo script che eliminerà le colonne in cui il numero di valori di dati validi è inferiore o uguale a 8.
Names Default To Here( 1 );
dt_2 = Current Data Table();
N_loop = N Cols( dt_2 );
i_loop = 2;
While( N_loop > i_loop,
If( Col Number( As Column( dt_2, N_loop ) ) <= 8,
dt_2 << Delete Columns( N_loop )
);
N_loop -= 1;
);
PS @jthi soluzione è una soluzione migliore.Il tuo approccio, con alcune correzioni, funziona.....quindi ottimo lavoro!
Oggetto: eliminazione di colonne con N valori di riga nulliMolti modi per farlo. Un'opzione è utilizzare Col Number o Col N Missing e For Each (richiede JMP16)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//delete some values
dt[1::20, "name"] = "";
dt[1::30, "sex"] = "";
dt[1::40, "height"] = .;
wait(2);
row_count = N Rows(dt);
For Each({col_name}, dt << Get Column Names("String"),
// missing_vals = Col N Missing(Column(dt, col_name));
// found_values = row_count - missing_vals;
found_values = Col Number(Column(dt, col_name));
If(found_values <= 8,
dt << Delete Column(col_name);
)
);