Eliminación de columnas con N valores de fila nulosTengo una tabla de valores en la que cada columna es un instrumento y cada fila es un tiempo. Algunos instrumentos no han tenido datos registrados en suficientes valores de tiempo para que yo pueda ajustar un modelo significativo.
Estoy intentando usar un ciclo que me permita recorrer cada columna por turno y verificar la cantidad de valores.
Tengo un código que encuentra el número de valores para la columna 80.
col_a = Column(dt_2, 80);
val_mat = col_a << Get Values;
y = sum(!is missing(val_mat));
Estoy intentando adaptar este código en un bucle para cada columna y eliminar columnas con muy pocos valores.
N_loop = N Cols(dt_2);
i_loop = 2;
While (i_loop <= N_loop,
col_loop = Column(dt_2, i_loop),
val_loop = col_loop << Get Values,
y_loop = sum(!is missing(val_loop)),
If(y_loop <= 8,
dt_2 << Delete Columns( i_temp ),
);
i_temp+=1,
);
El mensaje de error dice demasiados argumentos.
ventanasRe: Eliminación de columnas con N valores de fila nulosMuchas maneras de hacer esto. Una opción es usar Col Number o Col N Missing and For Each (requiere JMP16)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//delete some values
dt[1::20, "name"] = "";
dt[1::30, "sex"] = "";
dt[1::40, "height"] = .;
wait(2);
row_count = N Rows(dt);
For Each({col_name}, dt << Get Column Names("String"),
// missing_vals = Col N Missing(Column(dt, col_name));
// found_values = row_count - missing_vals;
found_values = Col Number(Column(dt, col_name));
If(found_values <= 8,
dt << Delete Column(col_name);
)
);Re: Eliminación de columnas con N valores de fila nulosLa razón por la que hay demasiados argumentos es que hay una segunda coma en la función While().
La estructura de una función While() es
While( testExpr, bodyExpr )
Nota: solo hay 2 argumentos para la función.La prueba
i_loop <= N_loop
y luego las declaraciones que se ejecutan si textExpr es verdadero.Su bodyExpr tiene comas después de cada declaración, en lugar de punto y coma.Por lo tanto, hacer de cada declaración un argumento separado.
No cambie las comas por punto y coma y ejecute este código.Hay un error lógico, que no permitirá que el código termine nunca.i_loop y N_loop nunca cambian de valor.
También hay una forma más rápida de verificar la cantidad de valores válidos en una columna.Además, si está eliminando columnas y su valor de N_loop permanece fijo, N_loop ya no es el número correcto de columnas en la tabla de datos, una vez que se elimina una columna.Es mejor trabajar desde la última columna hasta la primera columna en tales casos.
A continuación se muestra una revisión de su secuencia de comandos que eliminará las columnas donde el número de valores de datos válidos es menor o igual a 8.
Names Default To Here( 1 );
dt_2 = Current Data Table();
N_loop = N Cols( dt_2 );
i_loop = 2;
While( N_loop > i_loop,
If( Col Number( As Column( dt_2, N_loop ) ) <= 8,
dt_2 << Delete Columns( N_loop )
);
N_loop -= 1;
);
PD @jthi solución es una mejor solución.Su enfoque, con algunas correcciones, funciona... ¡buen trabajo!