Sostituisci i valori mancanti con 0Ciao,
Sto cercando di sostituire tutti i valori mancanti in una tabella di dati con 0.Lo script seguente non funziona.Uso JMP 13. C'è un altro modo per farlo?
dt <SPAN class="token operator">=</SPAN> <SPAN class="token function">Current Data Table</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
nc <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get column names</SPAN><SPAN class="token punctuation">(</SPAN> Numeric <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> <SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> nc <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,</SPAN>
nc<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN>dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> get rows where</SPAN><SPAN class="token punctuation">(</SPAN> <SPAN class="token function">Is Missing</SPAN><SPAN class="token punctuation">(</SPAN> nc<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token punctuation">)</SPAN> <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">=</SPAN> <SPAN class="token number">0</SPAN>
<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
Grazie!
Re: Sostituire i valori mancanti con 0>> Posso sostituire i valori mancanti nella colonna Numeric con la stringa "N/A"?
Usa le etichette dei valori per farlo. Fare clic con il tasto destro sull'intestazione della colonna, andare alle proprietà della colonna, selezionare Etichette valore. Quindi inserisci un punto nel valore e N/A nel campo dell'etichetta come mostrato di seguito. Quindi fare clic su Aggiungi e quindi su OK.
Per scriverlo, segui il registratore di registro dei passaggi precedenti ...
Data Table( "DT name" ):Column 904 << Value Labels( {"." = "N/A"} ) << Use Value Labels( 1 );

Re: Sostituire i valori mancanti con 0in Posso sostituire i valori mancanti nella colonna numerica con la stringa "N/A"?
Re: Sostituire i valori mancanti con 0Cari Ian e Craige,
Grazie mille per i tuoi contributi. Ho eseguito alcuni test preliminari e la soluzione di Ian è più di 4 volte più veloce di Recode per questo e la soluzione di Craige è quasi 10 volte più veloce. Se qualcuno desidera confrontare tutte e 3 le soluzioni, provare quanto segue:
//Recode solution
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.9; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
replaceMissingStart = HP Time();
// replace missings with zeros
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
col = Column(dt,nc[i]);
colname = col << getname();
Eval(Parse(EvalInsert("\[
dt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig, {., 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\")));
//Code from the Community
//Column( nc[i] )[dmdt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0;
// standardize column attributes, change all to nominal
//col << Set Modeling Type( "Nominal" )
);
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
Russ Wolfinger aveva detto che pensava che le matrici avrebbero risolto il problema più rapidamente, immagino fosse quello che stavate pensando anche voi due!
Re: Sostituire i valori mancanti con 0Combinazione di soluzioni, con la sottoscrizione di tabelle di dati...
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.9; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
replaceMissingStart = HP Time();
nc = dt << get column names( Numeric );
mat = dt[0,nc];
mat[Loc(mat, .)] = 0;
dt[0,nc] = mat;
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
Circa 10 secondi.
Re: Sostituire i valori mancanti con 0FWIW, questo tipo di approccio potrebbe essere migliore. Per 10.000 per 10.000 ci sono voluti circa 10 secondi sul mio laptop (inclusa la creazione della tabella di partenza):
NamesDefaultToHere(1);
// Size the problem . . .
nr = 10000; // Number of rows
nc = 10000; // Number of columns
nm = 0.1; // Proportion of missing values
// Make a table and inject some missing values
mat = J(nr*nc, 1, RandomNormal());
mat[RandomIndex(nr*nc, nr*nc*nm)] = .;
dt = AsTable(Shape(mat, nr, nc));
dt << setName("Data with some missingness");
// Start here: Get values into a matrix (assumes contiguous numeric columns)
mat = dt << getAsMatrix;
// Reshape as a vector
mat = Shape(mat, nr*nc, 1);
// Replace missing
mat[Loc(mat, .)] = 0;
// Reshape back to a matrix
mat = Shape(mat, nc, nc);
// Make a new table
dt2 = AsTable(Shape(mat, nr, nc));
dt2 << setName("Data with missing set to zero values");
Re: Sostituire i valori mancanti con 0Ciao a tutti,
Ho lavorato su questo problema esatto con centinaia di colonne con centinaia di righe mancanti. Non ero contento della performance e ho provato molti approcci. Sembra che Recode risolva questo problema circa 150 volte più velocemente della soluzione attuale. Condividere il codice con chiunque altro a cui potrebbe interessare la velocità. Per favore fatemi sapere se trovate qualcosa di più veloce. Ogni millisecondo conta! 
</CODE></P>
<PRE><CODE class=" language-jsl">replaceMissingStart = HP Time();
// replace missings with zeros
nc = dmdt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
col = Column(dt,nc[i]);
colname = col << getname();
Eval(Parse(EvalInsert("\[
dmdt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig, {., 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\")));
//Code from the Community
//Column( nc[i] )[dmdt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0;
// standardize column attributes, change all to nominal
col << Set Modeling Type( "Nominal" )
);
replaceMissingStop = HP Time();
totalReplaceTime = replaceMissingStop-replaceMissingStart;
show(totalReplaceTime/1000000);
</CODE></P>
<P>Grazie a Rebecca Lyzinski per l'idea!!!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-228122" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-228122" slang="en-US" mode="NONE"><P>Uso costantemente questo script.Non posso ringraziarti abbastanza per averlo fornito.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65695" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-65695" slang="en-US" mode="NONE"><P>cerca di essere un po' più specifico nella tua sceneggiatura.</P>
<P>assegnare un handle alla tabella di dati che contiene la colonna specifica. Come dt=table(); o qualcosa di simile.</P>
<P>quindi fare riferimento alla colonna della tabella, dt::nameOFCol</P>
<P> </P>
<P>È probabile che lo script stia tentando di modificare una colonna che non esiste nella tabella corrente quando viene eseguito questo passaggio.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65039" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-65039" slang="en-US" mode="NONE"><P>Qualcosa di simile è difficile da diagnosticare da una descrizione.Probabilmente dovresti pubblicare il tuo script (o almeno una quantità sufficiente per replicare il problema) per consentirci di aiutarti.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64972" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64972" slang="en-US" mode="NONE"><P>Ciao Cameron,</P><P> </P><P>Ho riavviato JMP e lo script funziona correttamente sulla tabella dati specifica.I valori mancanti vengono sostituiti con 0.Ma quando integro il resto del mio script, mi dà l'errore seguente:</P><P><EM><FONT color="#FF0000">impossibile trovare la colonna in accesso o valutazione di 'Column' , Column/*###*/(nc[i])</FONT></EM></P><P> </P><P>Prima di questo pezzo di script, ho una tabella di dati originale che ho sottoinsieme in base a colonne selezionate, impilare i dati, riepilogare e quindi tabulare nella tabella di dati finale.Sto cercando di sostituire i valori mancanti nella tabella dati finale con 0. </P><P> </P><P>Sono abbastanza nuovo per gli script JMP, non sono sicuro del motivo per cui l'integrazione sta dando problemi.Qualche idea sul perché questo sta accadendo?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64943" slang="en-US" mode="NONE"><P>CIAO<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/12425" target="_blank"> @nshivan</A> ,</P><P>Ho eseguito il codice di Jim nelle versioni 13 e 14 e non ho riscontrato errori.Forse riavviare JMP ed eseguirlo di nuovo?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">Re: Sostituire i valori mancanti con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64931" slang="en-US" mode="NONE"><P>Ciao Jim,</P>
<P> </P>
<P>Ho provato quanto sopra, ma ottenendo l'errore seguente.</P>
<P> </P>
<P> </P>
<PRE><CODE class=" language-jsl">could not find column in access or evaluation of 'Column' , Column/*###*/(nc[i])
Qualche idea su cosa sta succedendo?Uso JMP 13, non sono sicuro che la sintassi non funzioni per questa versione.
Grazie,
N
Re: Sostituire i valori mancanti con 0Ecco la sintassi corretta per quello che stai cercando di fare
dt = Current Data Table();
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
Column( nc[i] )[dt << get rows where( Is Missing( As Column( nc[i] ) ) )] = 0
);