¡Hola explorador@s de datos! ¿Sabes lo que significa que 2 palabras sean ANAGRAMA entre ellas? Pues no te preocupes porque hoy vamos a explicar qué significa y vamos a crear una columna en DAX que nos ayude a detectarlas.
¿Qué son palabras anagrama?
Si comenzamos por la definición «técnica» de lo que significa, diremos que un anagrama es una palabra o frase que se forma reorganizando las letras de otra palabra o frase, utilizando todas las letras exactamente una vez.
Por ejemplo, «AMOR» y «ROMA» o «CARTA» y «TRACA» son anagramas, ya que puedes reordenar las letras de «AMOR» para formar «ROMA» o con las letras de la palabra «CARTA» escribir también «TRACA».
Nuetro reto va a ser poder identificar de una tabla formada por 2 columnas, las filas que sean anagrama y para esto hoy lo vamos a resolver utilizando una columna calculada con DAX (Data Analysis eXpressions), lenguaje que utilizamos en Power BI, Power Pivot y Analysis Services
Partimos de la siguiente situación inicial, dónde tenemos una tabla llamada tblPalabras cargada ya en un modelo de datos Power BI con la siguiente información:
Ahora vamos a crear una columna calculada en la tabla para que indique si las palabras de la misma fila son o no anagrama.
Para esto, la lógica aplicada será la siguiente para cada una de las 2 columnas.
- Crearemos una tabla virtual dónde en cada fila tendremos el número de posición de la letra y en otra columna la letra asociada a esa posición.
- Ordenaremos la tabla de forma ascendente por la columna que contenga las letras
- Recorreremos la tabla ya ordenada para crear un texto que concatene las letras de cada fila
- Acabamos por comparar los resultados de las 2 columnas para comprobar si son iguales o no
Genial, y ahora que ya sabemos la «teoría» vamos a ver como solucionamos en la «práctica».
Comenzamos creando una nueva columna con nombre «Anagrama» en nuestra tabla de palabras y comenzamos creando 2 variables LargoP1 y LargoP2 que servirán después para controlar las posiciciones por las que iterar para obtener las letras.
A continuación, creamos una nueva variable que generará una tabla virtual con la lista de las letras que forman la palabra. Para hacerlo, utilizamos la función ADDCOLUMNS que tiene como primer parámetro una tabla.
La tabla que vamos a incluir va a ser una serie numérica de 1 a n siendo n el número de carácteres de la palabla que estamos analizando. Para esto nos ayuda la función GENERATESERIES de DAX que justamente crea tablas formadas por secuencias numéricas. Guardaremos esta tabla creada con GENERATESERIES en una nueva variable, tal como vemos a continuación:
El resultado obtenido lo podemos observar si utilizamos la nueva vista de cosultas DAX de Power BI.
Ahora como hemos comentado anteriormente, vamos a utilizar la función ADDCOLUMNS sobre la variable tablaP1 para agregar una columna al lado de cada valor numérico correspondiente al carácter de la palabra. Para esto, utilizaremos la función MID que sirve para extraer de un TEXTO a partir de una posición, una cantidad n de caracteres.
Ahora, lo que tenemos conseguido es lo siguiente, una tabla con una secuencia de 1 a 5 y en la segunda columna el valor del caracter correspondiente.
El siguiente paso será recorrer la tabla para construir un «string» con cada una de las letras de la columna [@Letras] y ese texto ordenarlo de forma ascendente.
Para esta tarea, tenemos la función DAX llamada CONCATENATEX que realiza justamente lo comentado, recorre una tabla y concatena los valores de cada una de las celdas por las que itera, además, permite ordenar los valores que ha concatenado.
Ahora, repetimos todo el proceso también para la columna [Palabra2]
Por último, después de tener todo el proceso dividido en bloques y obtener la variable palabra1 y palabra2 con los caracteres de las palabras ordenadas de forma ascendente, solamente nos queda preparar el resultado final tras el comando RESULT realizando un condicional que compruebe si son iguales palabra1 y palabra2.
El resultado final como podemos comprobar, nos identifica que parejas de palabras son Anagrama y No Anagrama.
Aquí dejamos el código de la columna Anagrama para que puedas copiarlo
Anagrama =
Fin del código
// Comenzamos guardando el número de letras que contiene cada palabra VAR largoP1 = LEN ( [Palabra1] )
VAR largoP2 = LEN ( [Palabra2] )
// Creamos una var que almacena una tabla con los números de 1 a largoP1
VAR tablaP1 = GENERATESERIES( 1 , largoP1 )
// Agregamos a la tabla anterior una columna con cada la letra de la palabra VAR tablaPP1 =
ADDCOLUMNS(
tablaP1,
«@Letra», MID ( [Palabra1] , [Value] , 1 )
)
// Utilizamos CONCATENATEX para iterar por tablaPP1 y concatenar los valores de la columna «@Letra» sin ningún separador y ordenada en orden ascendente.
VAR palabra1 = CONCATENATEX( tablaPP1 , [@Letra] , , [@Letra] , ASC )
// Repetimos el proceso para la segunda palabra.
VAR tablaP2 = GENERATESERIES( 1 , largoP2 )
VAR tablaPP2 =
ADDCOLUMNS(
tablaP2,
«@Letra», MID ( [Palabra2] , [Value] , 1 )
)
VAR palabra2 = CONCATENATEX( tablaPP2 , [@Letra] , , [@Letra] , ASC )
// Comprobamos si los 2 valores obtenidos son iguales o no
RETURN
IF ( palabra1 = palabra2 , «Anagrama», «No Anagrama» )
También dejo el fichero Anagrama.zip disponible para que lo descarguéis.
Espero que te hayas divertido con el post y que hayas aprendido algo 🙂 y si alguno tiene una propuesta distinta con otro enfoque, por favor, dejad vuestros comentarios y mejoras!
Hasta la próxima, ¡y sigue explorando el mundo de los datos!