Divida los valores de una celda en una columna en varias columnas por valor

Un usuario Pregunto ✅

Mahmud

Hola queridos,

Tengo una columna (como se ve en la foto de abajo) llamada Q, esta pregunta puede almacenar muchos valores. Y estos valores se pueden cambiar en otro momento para tener más opciones (linke alguien puede seleccionar una respuesta para esta pregunta otras opciones entre 6 a 11).

– Me gustaría dividir estos valores en columnas, pero cada valor debe establecerse en la misma columna. Intenté dividir la columna pero no dividió el valor específico en una columna específica. Entonces, ¿cómo puedo arreglar eso?

– Me gustaría que el nuevo valor creara una nueva columna automáticamente o, dado que conozco todas las opciones, ¿es posible crear estas columnas y si alguien seleccionó estos valores, irá a esa columna automáticamente? si no, ¿cuál es la mejor solución para este escenario?

¡Gracias por su apoyo!

valores a columnas.png

Marcel Beug

En respuesta a Phil_Seamark

Una solución en Power Query sería:

  • agregar una columna de índice,
  • dividir la columna Q en una nueva columna,
  • expandir esta nueva columna,
  • agregue una nueva columna con el prefijo «V»,
  • pivote (incluí un tipo exótico (en la parte del número numérico del valor prefijado),
    solo porque se puede y porque hoy es sábado),
  • ordenar de nuevo a la ordenación original
  • eliminar la columna de índice

Este video lo lleva a través de todos los pasos:

let
    Source = Table1,
    Indexed = Table.AddIndexColumn(Source, "Index", 0, 1),
    Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")),
    Expanded = Table.ExpandListColumn(Splitted, "Splitted"),
    Prefixed = Table.AddColumn(Expanded, "Inserted Prefix", each "V" & [Splitted], type text),
    Pivoted = Table.Pivot(Prefixed, 
                          List.Sort(List.Distinct(Prefixed[#"Inserted Prefix"]),
                                    (x,y) => Value.Compare(Number.From(Text.Middle(x,1)),
                                                           Number.From(Text.Middle(y,1)))),
                          "Inserted Prefix",
                          "Splitted"),
    OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}),
    RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"})
in
    RemovedIndex

Marcel Beug

En respuesta a Mahmud

«Tengo 2 preguntas» seguido de una lista de 5…

De todos modos, si tiene datos mixtos, sugeriría ordenar los datos antes de pivotar.

Ahora el paso de pivote se ve así:

Divida los valores de una celda en una columna en varias columnas por valor.png

y el código de consulta completo:

let
    Source = Table1,
    Indexed = Table.AddIndexColumn(Source, "Index", 0, 1),
    Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")),
    Expanded = Table.ExpandListColumn(Splitted, "Splitted"),
    AddedSortColumn = Table.Buffer(Table.AddColumn(Expanded, "SortColumn", each try Number.From([Splitted]) otherwise [Splitted])),
    Sorted = Table.Sort(AddedSortColumn,{{"SortColumn", Order.Ascending}}),
    RemovedSortColumn = Table.RemoveColumns(Sorted,{"SortColumn"}),
    Prefixed = Table.AddColumn(RemovedSortColumn, "Inserted Prefix", each "V" & [Splitted], type text),
    Pivoted = Table.Pivot(Prefixed, List.Distinct(Prefixed[#"Inserted Prefix"]), "Inserted Prefix", "Splitted"),
    OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}),
    RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"})
in
    RemovedIndex

La solución es dinámica ya que agrega todas las columnas requeridas, también si los datos futuros requieren más o menos columnas.

Entonces, con su último ejemplo agregado, obtuve el siguiente resultado con la columna «Vother» agregada automáticamente:

Divida los valores de una celda en una columna en varias columnas por valor - result.png

Hola @mahmoud

¿Cuántas opciones tendrás? Sus datos de muestra solo muestran números hasta 12. Si ese es el caso, puede crear manualmente fórmulas DAX para crear columnas calculadas y solo se completa si encuentra un valor clave en la columna Q.

Algo en la línea de

V12 = 
Var myVal = "12"
RETURN IF(FIND(" " & myVal & " "," " & 'Table1'[Q] & " ",,0)>0,myVal,blank())

que puedes repetir

Mahmud

En respuesta a Phil_Seamark

Hola @Phil_Seamark

Gracias por su sugerencia, tengo 30 preguntas y cada pregunta tiene muchas opciones (en total 244 opciones). Eso significa que tengo que crear 244 columnas. 🙂

La letra «V» solía explicar que los valores de las opciones serían los nombres de las columnas.

Desearía que hubiera otra manera de conseguir eso. :), que Power BI agregue estos futuros a la próxima versión.

Atentamente

mahmud

Marcel Beug

En respuesta a Mahmud

@mahmoud, ¿pasaste por alto mi publicación?

Mahmud

En respuesta a Marcel Beug

Hola @MarcelBeug

Gracias por su ayuda, estoy probando su método, ceré una tabla separada como lo hizo, es un trabajo.

Pero cuando llego a datos reales, se detiene en el paso Columna pivote.

me da error

DataFormat.Error: No pudimos convertir a Número.
Detalles:
3 9 otros

Tengo dos preguntas:

– si la columna Q tiene un valor como «3 9 otro» afectará el proceso, porque estoy trabajando con valores de texto.

– ¿Es posible grabar o mostrar imágenes usando la interfaz de Power Query (pantalla completa para ver si olvidé el paso o cometí errores)

– con esta cantidad de preguntas, ¿tengo que repetir el proceso para cada columna?

– si el nombre de mi columna tiene (/), ¿debería eliminar este / de todos los nombres de las columnas?

– si algunos seleccionaron la opción 7 en el futuro, ¿tendré que repetir el proceso o agregará automáticamente estos nuevos valores como una nueva columna?

¡Gracias por su apoyo!

Atentamente

mahmud

Error.pngIntenté usar la columna de índice como columna de valoresIntenté usar la columna de índice como columna de valores

Marcel Beug

En respuesta a Mahmud

«Tengo 2 preguntas» seguido de una lista de 5…

De todos modos, si tiene datos mixtos, sugeriría ordenar los datos antes de pivotar.

Ahora el paso de pivote se ve así:

Divida los valores de una celda en una columna en varias columnas por valor.png

y el código de consulta completo:

let
    Source = Table1,
    Indexed = Table.AddIndexColumn(Source, "Index", 0, 1),
    Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")),
    Expanded = Table.ExpandListColumn(Splitted, "Splitted"),
    AddedSortColumn = Table.Buffer(Table.AddColumn(Expanded, "SortColumn", each try Number.From([Splitted]) otherwise [Splitted])),
    Sorted = Table.Sort(AddedSortColumn,{{"SortColumn", Order.Ascending}}),
    RemovedSortColumn = Table.RemoveColumns(Sorted,{"SortColumn"}),
    Prefixed = Table.AddColumn(RemovedSortColumn, "Inserted Prefix", each "V" & [Splitted], type text),
    Pivoted = Table.Pivot(Prefixed, List.Distinct(Prefixed[#"Inserted Prefix"]), "Inserted Prefix", "Splitted"),
    OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}),
    RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"})
in
    RemovedIndex

La solución es dinámica ya que agrega todas las columnas requeridas, también si los datos futuros requieren más o menos columnas.

Entonces, con su último ejemplo agregado, obtuve el siguiente resultado con la columna «Vother» agregada automáticamente:

Divida los valores de una celda en una columna en varias columnas por valor - result.png

Bepachec

En respuesta a Marcel Beug

¡Hola! @MarcelBeug

Muchas gracias por tu solución. Tengo una pregunta especial con respecto a este tema. Tengo una columna «Etiquetas» donde cada celda que baja por la columna tiene un largo diccionario de elementos, por así decirlo. Una celda de ejemplo sería: {«Centro de costos»: «0000», «Aplicación»: «PowerBI», «Entorno»: «DEV»}. Sin embargo, cada celda tiene un número diferente de etiquetas (una sin centro de costo, etc.).

Mi objetivo es crear una columna de Centro de costos con todos los valores debajo, una Columna de aplicación con todos los valores debajo, etc.

Si es más simple, tengo una lista de encabezados de etiquetas que estoy buscando específicamente para hacer un número específico de columnas en lugar de revisar cada elemento en cada celda (hay mucho texto no deseado en algunos de estos). Entonces, si hay una manera más fácil de extraer solo los valores que necesito y crear columnas, ¡lo agradecería mucho!

También me gustaría eliminar el «» también.

Mahmud

En respuesta a Marcel Beug

@MarcelBeug ¡Muchas gracias! Lamento escribir. Tengo dos preguntas y luego escribí cinco. guiño sonriente
Estaba escribiendo las preguntas, durante eso recordé otro escenario pero olvidé corregir el número de preguntas sonriente jajaja

Intentaré nuevamente para obtener los mismos resultados. Comprobaré los valores.

Atentamente

mahmud

Marcel Beug

En respuesta a Phil_Seamark

Una solución en Power Query sería:

  • agregar una columna de índice,
  • dividir la columna Q en una nueva columna,
  • expandir esta nueva columna,
  • agregue una nueva columna con el prefijo «V»,
  • pivote (incluí un tipo exótico (en la parte del número numérico del valor prefijado),
    solo porque se puede y porque hoy es sábado),
  • ordenar de nuevo a la ordenación original
  • eliminar la columna de índice

Este video lo lleva a través de todos los pasos:

let
    Source = Table1,
    Indexed = Table.AddIndexColumn(Source, "Index", 0, 1),
    Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")),
    Expanded = Table.ExpandListColumn(Splitted, "Splitted"),
    Prefixed = Table.AddColumn(Expanded, "Inserted Prefix", each "V" & [Splitted], type text),
    Pivoted = Table.Pivot(Prefixed, 
                          List.Sort(List.Distinct(Prefixed[#"Inserted Prefix"]),
                                    (x,y) => Value.Compare(Number.From(Text.Middle(x,1)),
                                                           Number.From(Text.Middle(y,1)))),
                          "Inserted Prefix",
                          "Splitted"),
    OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}),
    RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"})
in
    RemovedIndex

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *