eliminar columnas categóricas casi vacías¿Puede ayudarme alguien?
Desde una base de datos necesito eliminar columnas categóricas con un cierto porcentaje de caracteres faltantes y al mismo tiempo me gustaría eliminar las columnas numéricas con un porcentaje de valores estancados (no es necesario 100%).
Gracias. Felice
Re: eliminar columnas categóricas casi vacíasPerfecto gracias.
Felice
Re: eliminar columnas categóricas casi vacíasSí, todo depende de cómo lo configures. La primera verificación es encontrar el valor más común en cada columna y determina si está por encima o por debajo del porcentaje de umbral. Desafortunadamente, un valor perdido no es un valor, por lo que no puede ser el más común. Por eso no funciona en las columnas numéricas. Funciona en las columnas de caracteres b / c "" falta tanto como un valor de cadena vacío.
Espero que ayude a explicar las cosas.
Si desea más granularidad, simplemente ejecute múltiples bucles con diferentes porcentajes utilizando diferentes estrategias.Re: eliminar columnas categóricas casi vacíasHola msharp gracias por tu respuesta. Vamos a hacer otra pregunta. ¿El porcentaje de trabajo variable para columnas categóricas y numéricas? En caso afirmativo, ¿puedo tener dos valores diferentes para los casos perdidos y estancados?
Perdón por una pregunta tal vez estúpida, pero no soy experto en lenguaje jsl.
Felice
Re: eliminar columnas categóricas casi vacíasSolo combina las estrategias. Algo como:
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,i)<<GETASMATRIX> numRows * percent/100,
insert into(delcols, i);
,
if(Col N Missing(column(dt,i)) > numRows * percent/100,
insert into(delcols, i);
);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols)); </GETASMATRIX>Re: eliminar columnas categóricas casi vacíasHola
Probé el script yor en la segunda tabla a continuación y el resultado está aquí.
Como puede ver, fue capaz de eliminar casi todas las columnas deseadas, pero la segunda (col2) no. ¿Cómo puedo hacer para eliminarlo también?
Gracias felice


Re: eliminar columnas categóricas casi vacíasEs posible que pueda utilizar el método que publicó anteriormente pero con el modo de la columna para algo menos del 100%.
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
if(nrows(loc(aslist(column(dt,i)<<getasmatrix),mode(column(dt,i)<<getasmatrix))) > numRows * percent/100,
insert into(delcols, i);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));
Re: eliminar columnas categóricas casi vacíasCreo que también estás buscando algo como esto:
Lo que eliminará una columna numérica si todos los datos son solo un valor.
Names Default To Here( 1 );
dt = Current Data Table();
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
col = column(dt, i);
try(summarize(dt, max = max(col), min = min(col));
if((max == min) | (ismissing(max)),
insertinto(delcols, i);
)
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));Re: eliminar columnas categóricas casi vacíasOtro método, creo que un poco más robusto.
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
delcols = {};
numRows = nrows(dt);
for(i=1; maxi=NCols(dt), i<=maxi, i++,
col = column(dt, i);
nmissing = col N missing(col);
if(nmissing > numRows * percent/100,
insert into(delcols, i);
);
);
if(nitems(delcols) > 0, dt << delete columns(delcols));
Re: eliminar columnas categóricas casi vacíasAquí hay una secuencia de comandos rápida y sucia que elimina las columnas con menos de un porcentaje específico de datos
Names Default To Here( 1 );
dt = Current Data Table();
percent = 90;
colList = dt << get column names( character, string );
NumRows = N Rows( dt );
For( i = N Items( colList ), i >= 1, i--,
If( Col Number( Column( dt, i ) ) / NumRows * 100 < percent,
dt << delete columns( colList[i] )
)
);