Reemplace los valores faltantes con 0Hola,
Estoy tratando de reemplazar todos los valores faltantes en una tabla de datos con 0.El siguiente script no funciona.Uso JMP 13. ¿Hay alguna otra forma de hacerlo?
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>
¡Gracias!
Re: Reemplazar los valores faltantes con 0>> ¿Puedo reemplazar los valores que faltan en la columna numérica con la cadena "N/A"?
Use etiquetas de valor para hacer eso. Haga clic derecho en el encabezado de la columna, vaya a las propiedades de la columna, seleccione Etiquetas de valor. Luego ponga un punto en el valor y N/A en el campo de la etiqueta como se muestra a continuación. Luego haga clic en Agregar y luego en Aceptar.
Para escribirlo, siga la grabadora de registros de los pasos anteriores...
Tabla de datos( "Nombre DT" ):Columna 904 << Etiquetas de valor( {"." = "N/A"} ) << Usar etiquetas de valor( 1 );

Re: Reemplazar los valores faltantes con 0¿Puedo reemplazar los valores que faltan en la columna numérica con la cadena "N/A"?
Re: Reemplazar los valores faltantes con 0Estimados Ian y Craige,
Muchas gracias por sus envíos. Realicé algunas pruebas preliminares y la solución de Ian es más de 4 veces más rápida que Recode para esto y la solución de Craige es casi 10 veces más rápida. Si alguien quisiera comparar las 3 soluciones, intente lo siguiente:
//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 había mencionado que pensaba que las matrices resolverían el problema más rápidamente, ¡supongo que eso era lo que ustedes dos también estaban pensando!
Re: Reemplazar los valores faltantes con 0Combinando soluciones, con subíndices de tablas de datos...
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);
Unos 10 segundos.
Re: Reemplazar los valores faltantes con 0FWIW, este tipo de enfoque podría ser mejor. Para 10,000 por 10,000 tomó alrededor de 10 segundos en mi computadora portátil (incluida la creación de la tabla inicial):
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: Reemplazar los valores faltantes con 0Hola a todos,
He estado trabajando en este problema exacto con cientos de columnas con cientos de filas faltantes. No estaba contento con el rendimiento y probé muchos enfoques. Parece que Recode resuelve este problema unas 150 veces más rápido que la solución actual. Compartir el código con cualquier otra persona a la que le pueda interesar la velocidad. Por favor, avíseme si encuentra algo más rápido. ¡Cada milisegundo cuenta! 
</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>Gracias a Rebecca Lyzinski por la idea!!!</P></LINGO-BODY><LINGO-SUB id="lingo-sub-228122" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-228122" slang="en-US" mode="NONE"><P>Yo uso este script constantemente.No puedo agradecerles lo suficiente por proporcionarlo.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65695" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-65695" slang="en-US" mode="NONE"><P>intente ser un poco más específico en su guión.</P>
<P>asigne un identificador a la tabla de datos que tiene la columna específica. Como dt=tabla(); o algo así.</P>
<P>luego consulte la columna de la tabla, dt::nameOFCol</P>
<P> </P>
<P>Es probable que su secuencia de comandos intente modificar una columna que no existe en la tabla actual cuando se ejecuta este paso.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-65039" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-65039" slang="en-US" mode="NONE"><P>Algo como esto es difícil de diagnosticar a partir de una descripción.Probablemente tendría que publicar su script (o al menos lo suficiente para replicar el problema) para que podamos ayudarlo.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64972" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64972" slang="en-US" mode="NONE"><P>Hola cameron,</P><P> </P><P>Reinicié JMP y el script funciona bien en la tabla de datos específica.Los valores que faltan se reemplazan con 0s.Pero cuando me integro al resto de mi script, me da el siguiente error:</P><P><EM><FONT color="#FF0000">no se pudo encontrar la columna en el acceso o evaluación de 'Columna', Columna/*###*/(nc[i])</FONT></EM></P><P> </P><P>Antes de este fragmento de secuencia de comandos, tengo una tabla de datos original que divido en subconjuntos en función de las columnas seleccionadas, apilo los datos, resumo y luego los tabulo en la tabla de datos final.Estoy tratando de reemplazar los valores faltantes en la tabla de datos final con 0. </P><P> </P><P>Soy bastante nuevo en los scripts JMP, no estoy seguro de por qué la integración está dando problemas.¿Alguna idea de por qué sucede esto?</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-64943" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64943" slang="en-US" mode="NONE"><P>Hola<A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/12425" target="_blank"> @nshivan</A> ,</P><P>Ejecuté el código de Jim en las versiones 13 y 14 y no obtuve errores.¿Quizás reiniciar JMP y ejecutarlo de nuevo?</P></LINGO-BODY><LINGO-SUB id="lingo-sub-64931" slang="en-US" mode="NONE">Re: Reemplazar los valores faltantes con 0</LINGO-SUB><LINGO-BODY id="lingo-body-64931" slang="en-US" mode="NONE"><P>Hola Jim,</P>
<P> </P>
<P>Intenté lo anterior, pero obtuve el siguiente error.</P>
<P> </P>
<P> </P>
<PRE><CODE class=" language-jsl">could not find column in access or evaluation of 'Column' , Column/*###*/(nc[i])
¿Tienes idea de lo que está pasando?Uso JMP 13, no estoy seguro si la sintaxis no funciona para esta versión.
Gracias,
norte
Re: Reemplazar los valores faltantes con 0Aquí está la sintaxis correcta para lo que está tratando de hacer
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
);