c'è un modo per rivalutare automaticamente il tipo di dati?Se ho una tabella di dati che ho diviso in colonne diverse, tutte le colonne escono con un tipo di dati "Carattere" come previsto.
Ora, c'è un modo per scrivere uno script JSL per rivalutare automaticamente se il tipo di dati deve essere numerico o carattere? Se rileva che l'immissione di dati è costituita da numeri, modificare il tipo di dati in numerico?
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Un approccio sarebbe contare il numero di valori mancanti, prendere un elenco dei valori, forzare la colonna su numerico, quindi contare nuovamente il numero di valori mancanti. Se il numero di mancanti è lo stesso prima e dopo, hai una colonna numerica. In caso contrario, modificalo nuovamente e sostituisci i valori con la copia.
Dove ciò fallirebbe è quando un valore non numerico, come NA, appare in una colonna numerica.
Names Default to Here(1);
tblRef = Current Data Table();
For(i=1,i<=N Col(tblRef),i++,
nMissing = Col N Missing(Column(tblRef,i));
nextVals = Column(tblRef,i) << Get Values;
Column(tblRef,i) << Set Data Type(Numeric);
If(Col N Missing(Column(tblRef,i)) != nMissing,
Column(tblRef,i) << Set Data Type(Character);
Column(tblRef,i) << Set Values(nextVals)
)
)
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Don mi ha battuto per una soluzione, ma un'altra opzione sarebbe quella di utilizzare un'espressione regolare per determinare se ogni colonna contiene solo caratteri numerici e punto (virgola decimale). L'esempio seguente prende ogni colonna, concatena tutti i suoi valori in una grande stringa, quindi controlla se quella stringa contiene caratteri che non sono un numero o un separatore decimale ([^0-9\.] ). Se trova solo numeri e punti decimali nell'intera colonna (ad esempio, Contiene elemento restituisce zero), imposta il tipo di dati su numerico.
Names Default to Here( 1 );
cols = Current Data Table() << Get Column Names();
for( i = 1, i <= Length( cols ), i++,
vals = As Column( cols[i] ) << Get Values;
valsConcat = Concat Items( vals, "" );
If( Contains Item( valsConcat, Pat Regex( "[^0-9\.]") ),
Continue(),
As Column( cols[i] ) << Set Data Type( "Numeric" );
)
);
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Se non hai bisogno di una soluzione automatizzata, c'è un triangolo rosso Parse as Numbers opzione in Recode. Cambia qualsiasi voce non numerica (come NA) in un valore mancante.
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Un potenziale problema con questo approccio è che non supporta la notazione scientifica. Modificare la Regex per accettare la notazione scientifica e le negazioni, rifiutando al contempo cose come telefoni e numeri di previdenza sociale, la rende significativamente (hah! Gioco di parole!) Più complessa.
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Questo è l'approccio che consiglio. A seconda dei dati che potrebbero essere incontrati, ho anche fatto quanto segue:
1) Usa solo le prime k righe di ogni colonna per prendere la decisione, per aumentare l'efficienza.
2) Consentire una certa percentuale (aggiustare secondo necessità) di mancanze in una data colonna (o suo sottoinsieme). Al di sotto di questa soglia, converti comunque in numerico.
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Insieme alle complicazioni già menzionate, avere la soluzione considera anche le virgole come segnaposto decimale o come separatori numerici per le migliaia. In questo modo potrebbe essere anche una soluzione più internazionale.
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Buon punto (e gioco di parole), Brady. Questa soluzione regex funziona per i dati di esempio ben educati, ma non si generalizzerebbe a tutti i dati possibili. Immagino che ci sia un master regex che potrebbe portare a termine il lavoro, ma potrebbe essere un lavoro ingrato inventarlo. In alternativa, si potrebbe scorrere ogni singola riga in una colonna con uno o più controlli Contiene elemento più semplici; ad esempio, uno potrebbe consentire un trattino iniziale (per i numeri negativi) ma rifiutare qualsiasi cosa contenga trattini non iniziali, quindi un altro potrebbe verificare se la riga è conforme alla notazione scientifica. Se tutti i controlli passano per tutte le righe in una colonna, modificare il tipo di dati. Come dici tu, "significativamente" più complesso.
Ri: c'è un modo per rivalutare automaticamente il tipo di dati?Sono un po 'in ritardo per la festa, ma un modo "ingannevole" è esportare il file come csv, quindi reimportarlo, dove JMP determinerà automaticamente i tipi di colonna all'apertura. Ciò presuppone che non sia necessario salvare alcuno script di tabella o proprietà di colonna. Ecco un copione.
//assume file is in the downloads folder
dt = open ("$DOWNLOADS/Data to Split.jmp");
dtsplit = Data Table( "Data to split" ) << Split(
Split By( :Label ),
Split( :Data ),
Output Table( "Split Data.jmp" ),
Sort by Column Property
);
close (dt, no save);
dtsplit << Save as ("$DESKTOP/Split Data.csv");
close (dtsplit, no save);
ndt = open ("$DESKTOP/Split Data.csv");