eliminar columnas categóricas casi vacías¿Puede ayudarme alguien?
De 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.
Feliz
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 determinar si está por encima o por debajo del porcentaje umbral. Lamentablemente, un valor faltante 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 y hay 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 usando diferentes estrategias.Re: eliminar columnas categóricas casi vacíasHola msharp, gracias por tu respuesta. Hagamos otra pregunta. ¿La variable de porcentaje funciona tanto en columnas categóricas como numéricas? En caso afirmativo, ¿puedo tener dos valores diferentes para los casos faltantes y estancados?
Perdón por la pregunta tal vez estúpida, pero no soy un experto en lenguaje jsl.
Feliz
Re: eliminar columnas categóricas casi vacíasSimplemente combine 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 * porcentaje/100, insertar en(delcols, i); , if(Col N Missing(column(dt,i)) > numRows * percent/100, insertar en(delcols, i); ); ); ); if(nitems(delcols) > 0, dt << eliminar columnas (delcols)); </GETASMATRIX>Re: eliminar columnas categóricas casi vacíasHola
Probé su script en la segunda tabla a continuación y el resultado está aquí.
Como puede ver, pudo eliminar casi todas las columnas deseadas, pero la segunda (col2) no. ¿Cómo puedo hacer para eliminarlo también?
gracias felicia


Re: eliminar columnas categóricas casi vacíases posible que puedas usar el método que publicaste antes 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)< numRows * porcentaje/100, insertar en(delcols, i); ); ); if(nitems(delcols) > 0, dt << eliminar columnas (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 tienen un solo 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 un script rápido y sucio que elimina 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] )
)
);