Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Tengo un CSV exportado que se formó a partir de dos o más fuentes diferentes que tienen nombres de columnas ligeramente diferentes.
Ninguna fila tiene datos en más de una de esas columnas, como se muestra en la siguiente captura de pantalla:

¿Cómo los combino todos en una sola columna?
Una idea es utilizar
Combine Columns()
lo que dará como resultado una columna de Respuesta múltiple, pero como los datos no se intersecan, será solo un número en toda la columna. Luego, fuerce el tipo de datos a Numérico y el tipo de modelado a Continuo. Pero produce advertencia/error.
¿Existe alguna forma más limpia de hacerlo?
Automatización y scriptingAnálisis y modelado de datos básicosRe: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Yo lo manejaría de esta manera
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
:AA bb = Sum( :AA bb, :AA_bb_ )
);
El uso de la función Sum() ignora los valores faltantes, por lo que obtendrá los valores que desea.
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Jim,
Muchas gracias.
Voy a utilizar esta solución.
Ahora estoy intentando programarlo para que los nombres de las columnas no estén codificados.
No estoy muy seguro de por qué me aparece este error:
For Each Row(
Column("AA bb") = 1234;
//Sum( :AA bb, :AA _bb_ )
);El error es:
intentando asignar a un objeto que no es un valor L en la fila 1 en el acceso o evaluación de 'Asignar', Columna( "AA bb" ) = /*###*/1234 /*###*/
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?La idea es escribir una función y alimentar un diccionario a esa función.
Algo como esto:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row(
Column(dict[1]) = Sum( Column(dict[1]), Column(dict[2]) )
);Sólo esta variante da el siguiente error:
Necesita que los argumentos sean escalares, matrices o listas en la fila 1 en el acceso o la evaluación de 'Sum', Sum/*###*/(Column( dict[1] ), Column( dict[2] ))
Nunca pude entender el hecho de que a veces Column() funciona como se espera y a veces no. A veces necesito usar As Column(). A veces, algo más.
PS As Column() funcionó. ¿Alguien puede explicar la diferencia entre Column() y As Column()?
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Bueno, mi último fragmento de código está aquí:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
);
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
);
¿Alguna forma de mejorarlo?
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Es un poco más complicado de lo necesario. Este código también funciona sin pensar demasiado. Aceptará más de dos nombres de columna, en caso de que así se desee.
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row( dt,
As Column(dict[1]) = Sum( Transform Each( {v, i}, dict, As Column( v ) ) )
);Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Column() se refiere al objeto de columna y As Column() se refiere al valor de esa columna en la Row() actual.
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Mi próxima iteración tiene en cuenta un caso en el que el nombre de la columna está presente en el diccionario, pero no en la tabla:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
If( Try( Column( value ) << Get Name, "nocolumn" ) != "nocolumn",
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
)
);
Name Expr(sumExpr);
Try(
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
),
Write("No columns found")
)
¿Cómo harías eso al utilizar Transform Each?
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Intente utilizar la herramienta de concatenación:
Crea una nueva columna que incluirá ambas variables
Haga clic derecho en la columna
Seleccione Fórmula para abrir el Editor de fórmulas.
En el Editor de fórmulas, vaya a la lista Funciones a la izquierda.
En Carácter, busque y seleccione Concatenar.
Arrastre o seleccione la primera columna en el primer cuadro de argumento de la función Concatenar.
Arrastre o seleccione la segunda columna al siguiente cuadro de argumento.
Haga clic en Aceptar o Aplicar para crear la nueva columna combinada.
Re: Limpieza de datos: ¿Cómo combinar varias columnas con nombres ligeramente diferentes y datos que no se cruzan en una sola?Yo simplemente agregaría un Try().
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
For Each Row( dt, As Column( dict[1] ) = Sum( Transform Each( {v, i}, dict, Try( As Column( v ), . ) ) ) );