Hola a todos,
Mi pregunta es doble. Mis datos aparecen algo como esto:
| 1-A | X | y | . | . | . | . |
| 1-A | . | . | z | q | . | . |
| 1-A | . | . | . | . | w | w |
| 2-B | y | w | . | . | . | . |
| 2-B | . | . | t | y | . | . |
| 2-B | . | . | . | . | q | pag |
Me gustaría A) eliminar los puntos de datos vacíos y
consolidar las filas según el identificador en la primera columna que cada fila tiene en común (es decir, 1-A y 2-B).
Me gustaría que mi resultado final se viera así:
¿Alguien tiene alguna sugerencia sobre cómo abordar este problema en una tabla grande con cientos de valores?
Gracias de antemano,
charlie
Es hora de los peces gordos.Aquí hay un script que debería funcionar.Básicamente, la forma en que funciona es iterando por todas las filas y columnas.Si la siguiente fila tiene el mismo ID, pasa los valores no faltantes a la siguiente fila.En la última fila de un ID determinado, todos los valores que no faltan deben estar en esa fila.En el último paso, elimina todas las filas adicionales.
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
Esto funcionó perfectamente para tu ejemplo.Debería funcionar para su tabla, aunque si tiene millones de filas, podría tardar bastante en finalizar.Este script también supone que la columna se llama "ID" y que todas las demás columnas no deben tener valores faltantes para solo 1 fila para cada ID.
Tabla de inicio que utilicé para probar el script:
Mesa final:
Script para recrear mi tabla de inicio:
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)Lamentablemente, esta tabla tiene >1000 columnas. Gracias por la sugerencia, pero eso no parece factible.
Ahora, supongamos que quisiera ignorar los datos en blanco y atenderlos en una fecha posterior. ¿Cómo consolidaría las filas?Ojalá ese paso sea más factible.
Si no tiene demasiadas columnas, primero puede convertirlas en caracteres, seguir los pasos que recomendé y luego volver a convertir las columnas numéricas.Si su tabla es mucho más amplia que su ejemplo, es posible que esto no sea muy factible.
Lamentablemente los datos son mixtos: categóricos, binarios, numéricos, texto libre. Estoy buscando simplificar la base de datos y eliminar entradas en blanco innecesarias. Gracias por la sugerencia, pero no creo que funcione en este escenario.
Si los datos son numéricos, excluyendo la primera columna, entonces puedes usar
Tablas==>Resumen
y especifique generar una media o una suma para las columnas en cuestión
Gracias por la pronta respuesta. Debo agregar que he pasado por alto muchos de los detalles en mi tabla real; por ejemplo, cuando intento el Paso 1, JMP me dice "No se puede apilar. Las columnas apiladas son de diferentes tipos de datos".
¿Existe alguna forma de apilar columnas de distintos tipos de datos?
La forma más sencilla de hacerlo sería:
1. Apile todas esas columnas excepto la columna ID para que todas se consoliden en una sola columna de datos (la columna Etiqueta resultante mantiene la trazabilidad).
2. Elimine todas las filas con valores faltantes en la nueva columna de datos. Manera fácil: seleccione un valor faltante > haga clic derecho sobre él > seleccione las celdas coincidentes > haga clic derecho > eliminar filas.
3. Divida la tabla para volver a la forma original de la tabla de datos. La columna dividida es la nueva columna de datos. Dividir por es la nueva columna de etiqueta y puede agrupar por la columna de ID.