Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.

Reply
Syndicate_Admin
Administrator
Administrator

Creación de lógica para un indicador correcto o incorrecto en la tabla

Hola

Estoy buscando ayuda para crear una bandera que determine si una pregunta ha sido respondida correcta o incorrectamente.

El problema al que me enfrento es que no sé cómo hacer la lógica de la bandera, porque tengo muchas preguntas diferentes y, por supuesto, cada una tiene sus propias respuestas correctas (algunas pueden tener dos respuestas necesarias para ser correctas)

Espero que alguien pueda proporcionar alguna ayuda sobre esto en la estructuración de la lógica, y en qué tallo debería estar

Estructura:

FACT = Contiene los usuarios y sus respuestas, así como el ID de la pregunta

DIM = Contiene la lista total de preguntas y su correspondiente ID

Relación de muchos a uno en el ID de la pregunta FACT>DIM

jakaihammuda_0-1714667598501.png


Gracias

12 REPLIES 12
Syndicate_Admin
Administrator
Administrator

Hola @jakaihammuda

Necesitas saber qué se considera una respuesta correcta. Sin eso no puedes hacer lo que quieres. Así que lo primero es decidir cuál es una respuesta correcta a cada pregunta.

Phil

Hola @PhilipTreacy

En primer lugar, gracias por responder 🙂

Sí, lo he hecho, sin embargo, no estoy seguro de haberlo hecho correctamente. Vea la captura de pantalla a continuación y mi explicación

jakaihammuda_0-1714721188629.png

Creé una tabla de asnwers vinculada de nuevo a través de QuestionID. La cuestión es que, con las respuestas de opción múltiple, lo vi como que cada una necesitaría una columna separada para que Power BI la reconociera. Aquí es donde me puse a luchar con la escritura de la lógica porque ¿cómo escribirías (en la tabla de hechos con los usuarios y sus respuestas) la lógica para comprobar si las respuestas coinciden (para una respuesta asnwers) y luego para dos tendrías que decir algo como 'Está en ambas'?

Pensé en crear un ID de respuesta en esta tabla que se muestra arriba, pero luego el formato de los anwers dentro de la tabla FACT no coincidiría con este debido a la forma en que está formateado. Podría dividirlo por delimitador, pero eso aumentaría el volumen de la tabla.

Espero que esto tenga sentido en el lugar donde estoy luchando por unirlo todo

Gracias 🙂

Hola @jakaihammuda ,

@PhilipTreacy ¡Gracias por su preocupación por este caso!

Y @jakaihammuda , no estoy seguro de cómo se ve la respuesta a su pregunta, pero le sugiero que agregue palabras clave de la columna de respuesta directamente a la tabla DIM (o cree una nueva tabla, siéntase libre de hacer esto) para las palabras clave en cada respuesta a la pregunta (si hay más de una respuesta, escriba más de una palabra clave, con comas entre las palabras clave) y, a continuación, haga coincidir las de Respuesta. Después de todo, hay algunas preguntas en las que la respuesta del usuario puede no ser exactamente la misma que la respuesta correcta, pero también debería ser correcta.
Si todas las palabras clave coinciden, devuelva a la derecha, coincida con parte de las palabras clave devuelva Falta de otras respuestas, todas no coincidan y luego devuelva mal. Te puedo dar un ejemplo.
Aquí están mis datos de muestra:

vjunyantmsft_0-1714722003879.png

vjunyantmsft_1-1714722011324.png

A continuación, cree una nueva consulta en blanco:

vjunyantmsft_2-1714722043438.png

Y pon toda la función M en el Editor Avanzado:

let
    Source = Table.NestedJoin(FACT, {"QuestionID"}, DIM, {"QuestionID"}, "DIM", JoinKind.LeftOuter),
    #"Expanded DIM" = Table.ExpandTableColumn(Source, "DIM", {"keywords of the answer"}, {"keywords of the answer"}),
    #"Lowercased Text" = Table.TransformColumns(#"Expanded DIM",{{"keywords of the answer", Text.Lower, type text}}),
    CustomCheck = Table.AddColumn(#"Lowercased Text", "Answer Check", each 
        let
            AnswerLower = Text.Lower([Answer]),
            KeywordsList = Text.Split([keywords of the answer], ","),
            CheckList = List.Transform(KeywordsList, each Text.Contains(AnswerLower, Text.Trim(Text.Lower(_)))),
            AllKeywords = List.AllTrue(CheckList),
            AnyKeywords = List.AnyTrue(CheckList)
        in
            if AllKeywords then 
                "Right" 
            else if AnyKeywords then 
                "Lack of other answers" 
            else 
                "Wrong"),
    FinalTable = Table.RemoveColumns(CustomCheck,{"keywords of the answer"})
    
in
    FinalTable

El resultado final es el siguiente:

vjunyantmsft_3-1714722112877.png


Saludos
Dino Tao
Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Hola @v-junyant-msft

¡Esto tiene mucho sentido! Gracias

Un par de puntos para agregar a esto solo para actualizarlo con lo que encontré / qué voy a hacer y ver si esto funcionaría igual.

Mi primer punto es que, cuando los aswers entran para una pregunta y contienen múltiples palabras/opciones para la respuesta total. Están divididos por un punto y coma ";". ver más abajo

jakaihammuda_0-1714723017090.png


Entonces, ¿estás diciendo que podría hacer algo de transofmación, reemplazando el punto y coma por completo y dividiendo cada palabra por coma, entonces eso seguirá funcionando para que powerbi busque palabras clave separadas en ese campo?

Tiene sentido, sin embargo, solo tengo una pregunta que requiere que la respuesta esté en el orden exacto correcto. Algo que noté es que cuando un usuario responde a una pregunta de elección múltiple (solo tenemos una opción múltiple de seleccionar un máximo de 2) el orden depende de la que seleccione primero.

Esto elude mi siguiente punto, lo que decidí hacer fue esto (¿esperando que también funcionara?)

jakaihammuda_1-1714723140091.png

Cree una nueva tabla con el ID de la pregunta y luego el asnwer absolutamente correcto (basado en una respuesta o en dos partes), pero para cubrir el problema del orden, tenga una columna de segundo con el orden de respuesta invertido. Puedes ver lo que quiero decir en la imagen

De esta manera, ¿no podría escribir la lógica para que sea Respuesta1 O Respuesta2 para que sea correcta?

Sin embargo, con esto (consulte la pregunta ID 9 donde debe ser la respuesta exacta del orden), no sabría cómo crear la función de "falta de respuestas completas" que hizo decir si seleccionaron solo dos de ellos en el orden correcto, digamos el primer y el último lugar. Siento que esa tendría que ser su propia lógica en sí misma. Y me gusta mucho tu función de "falta de otras respuestas".

¿Recomendarías deshacerse del ";" ...

Este tipo de lógica es un poco de mi experiencia, por lo que su ayuda en esto sería de gran ayuda 🙂

¡Gracias!






@v-junyant-msft

solo para su información. Reemplacé el ";" con "&" así

jakaihammuda_0-1714724594437.pngjakaihammuda_1-1714724662374.png

Hola @jakaihammuda ,

Es casi el final de la semana, intentaré seguir probándolo como me pediste y te responderé a tiempo si tengo otra solución mejor.

Saludos
Dino Tao

Hola @v-junyant-msft

¡Muy apreciado, muchas gracias! Espero su respuesta 🙂

¡Cuídate mientras tanto!

Jakai

Hola @jakaihammuda ,

¡De vuelta al trabajo!

En primer lugar, sobre el tema de los separadores, ya sea que elija usar "," o ";" o "&" no son relevantes, solo necesita modificar el código en este lugar:

vjunyantmsft_0-1714956292818.png

Tenga en cuenta, sin embargo, que, en la medida de lo posible, solo se usa un separador en esta columna y puede ser problemático usar varios separadores, como comas y punto y coma.
También basándome en esta captura de pantalla tuya, veo que tienes espacios entre el & y el personaje, así que me temo que también necesitas contar los dos espacios antes y después del & como separadores.

vjunyantmsft_1-1714956414398.png

Luego, con respecto al problema del pedido, mi sugerencia es que puede agregar otra nueva columna Isorder en la tabla DIM y marcarla como 1 si hay un problema de orden con las respuestas a la pregunta actual, de lo contrario, márquela como nula. como se muestra a continuación:

vjunyantmsft_2-1714956674166.png

En la tabla FACT agregué algunos datos de muestra:

vjunyantmsft_3-1714956769388.png

A continuación, cree una nueva consulta en blanco y coloque toda la función M en el Editor avanzado:

let
    Source = Table.NestedJoin(FACT, {"QuestionID"}, DIM, {"QuestionID"}, "DIM", JoinKind.FullOuter),
    #"Expanded DIM" = Table.ExpandTableColumn(Source, "DIM", {"keyword", "Isorder"}, {"keyword", "Isorder"}),
    CustomCheck = Table.AddColumn(#"Expanded DIM", "Answer Check", each 
        let
            AnswerLower = Text.Lower([Answer]),
            lowerKeyword = Text.Lower([keyword]),
            KeywordsList = Text.Split(lowerKeyword, ","),
            CheckList = List.Transform(KeywordsList, each Text.Contains(AnswerLower, Text.Trim(Text.Lower(_)))),
            AllKeywords = List.AllTrue(CheckList),
            AnyKeywords = List.AnyTrue(CheckList)
        in
            if [Isorder] = 1 then 
                let
                    CheckAnswer = (QuestionID as number, keyword as text, Answer as text) => 
                    let
                        keywordList = Text.Split(lowerKeyword, ","),
                        checkOrder = List.Accumulate(
                        keywordList, 
                        [FoundAll = true, LastIndex = 0, WrongOrder = false], 
                        (state, currentKeyword) =>
                            let
                                currentIndex = Text.PositionOf(AnswerLower, currentKeyword, Occurrence.First),
                                isCurrentFound = currentIndex <> -1,
                                isNewIndexBigger = currentIndex > state[LastIndex],
                                isWrongOrder = state[WrongOrder] or (isCurrentFound and not isNewIndexBigger),
                                hasFoundAllSoFar = state[FoundAll] and isCurrentFound
                            in
                                [
                                    FoundAll = hasFoundAllSoFar,
                                    LastIndex = if isCurrentFound then currentIndex else state[LastIndex],
                                    WrongOrder = isWrongOrder
                                ]
                    ),
 
                    result = if not checkOrder[FoundAll] then 
                                "Lack of other answers" 
                            else if checkOrder[WrongOrder] then 
                                "wrong order" 
                            else 
                                "right"
                in
                    result
            in
                CheckAnswer([QuestionID], [keyword], [Answer])
            else if AllKeywords then 
                "Right" 
            else if AnyKeywords then 
                "Lack of other answers" 
            else 
                "Wrong"),
    FinalTable = Table.RemoveColumns(CustomCheck,{"keyword"})
in
    FinalTable

Y el resultado final es el siguiente:

vjunyantmsft_4-1714956994404.png


Saludos
Dino Tao
Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Hola, @v-junyant-msft

¡Muchas gracias por ayudar en esto!

Creo que ya casi estoy allí, pero solo el problema con respecto a las "palabras clave", esto no es óptimo para mí en función del hecho de que algunas de las palabras clave pueden aparecer en otras respuestas a preguntas que son incorrectas. Es mejor si lo hace solo en la respuesta correcta en lugar de las palabras clave.

Esta es mi estructura.

HECHO:
Contiene el usuario, el ID de resultados, la hora, las respuestas y el ID de pregunta

Tabla DIM (Respuesta correcta):

jakaihammuda_0-1715070325702.png

Tabla DIM (Pregunta)

jakaihammuda_1-1715070344375.png


Todavía quiero esa lógica o Correcto, parcialmente correcto, Incorrecto que has creado, pero no puedo basarlo en palabras 😞 clave, la lógica parcialmente correcta aún se puede aplicar, ¿verdad? ¿Usar la "&" y verificar las palabras antes / después de eso para ver si coincide con alguna en la respuesta correcta real?

¿Es necesario hacer muchas enmiendas para basarse únicamente en el verdadero asalto de la corrcet?



Hola @jakaihammuda ,

Utilicé palabras clave porque no estaba muy seguro de qué tipo de pregunta era tu tema.
Si tiene muchas preguntas subjetivas, es decir, necesita que el usuario organice sus propias respuestas, entonces puede haber casos en los que la respuesta del usuario no sea exactamente la misma que su respuesta estándar, pero sigue siendo correcta, y luego, si usa la respuesta estándar exclusivamente, entonces este tipo de respuesta se marcará como un error.
Sin embargo, si todas sus preguntas son objetivas, como preguntas de opción (múltiple) o de juicio, es decir, puede garantizar que la respuesta proporcionada por el usuario es palabra por palabra la misma que su respuesta estándar, entonces no importa. Pero si todas las preguntas son objetivas, entonces tal vez el método que proporcioné antes sea un poco complicado, porque utilizo la coincidencia de campos, y debería haber una forma más sencilla de hacerlo.

Así que todavía tengo que pedirte que confirmes que puedes garantizar que las respuestas de tus usuarios se pueden hacer para que se vean exactamente como tus respuestas estándar o no.

Saludos
Dino Tao

Hola @v-junyant-msft ,

Así que sí. Todas las preguntas con las que se está trabajando son objetivas. Los usuarios tienen que seleccionar las opciones (máximo 2 en algunos casos) o solo un resultado. No hay texto libre a partir de estas respuestas.

Sin embargo, solo hay una pregunta en la que tienen que reordenar los mosaicos para mostrar el orden correcto o los pasos del proceso, por lo que técnicamente solo hay una respuesta correcta, por lo que sería el equivalente a que una selección de una opción sea correcta o incorrecta.

El único problema que encontré fue ese, específicamente con las preguntas que tienen un "seleccionar 2". Los usuarios pueden seleccionar las dos respuestas correctas, pero el orden en el que las seleccionan primero depende del orden de visualización en el archivo de datos o SharePoint donde se guarda. Como puede ver en la captura de pantalla, no es un problema porque tengo 2 columnas de aswer correctas (1 y 2) para atender una o de las combinaciones (ya que solo puede haber un máximo de 2 combinaciones). Sin embargo, no es lo ideal que hiciera, solo lo hice porque me resultaba más fácil trabajar con él. Por ejemplo, si añadimos una pregunta en la que tienen que seleccionar 3 respuestas para ser correctas, las opciones de orden en las que pueden seleccionarlas aumentan, lo que significa que tenemos que crear aún más columnas de respuestas correctas para atender a todas las posibilidades. No sería lo ideal, pero solo lo hice porque no creo que las preguntas cambien.

¿Te ayuda esto a que te quede más claro? 🙂


Gracias

Hola @jakaihammuda ,

Dado que puede estar seguro de que todas las preguntas son objetivas, podemos usar una forma muy simple de completar esta pregunta. Recreé el conjunto de datos de prueba:

vjunyantmsft_0-1715130000091.png

vjunyantmsft_1-1715130008629.png

Supongo que las preguntas son de opción única, opción múltiple desordenada, juicio, clasificación en dos ítems y clasificación en tres ítems.
A continuación, como antes, Nueva fuente -> consulta en blanco:

vjunyantmsft_2-1715130172536.png

Y pon toda la función M en el Editor Avanzado:

let
    Source = Table.NestedJoin(FACT, {"QuestionID"}, DIM, {"QuestionID"}, "DIM", JoinKind.FullOuter),
    #"Expanded DIM" = Table.ExpandTableColumn(Source, "DIM", {"CorrectAnswers", "IsOrder"}, {"CorrectAnswers", "IsOrder"}),
    #"Added Custom" = Table.AddColumn(#"Expanded DIM", "Custom", each if [IsOrder] = 0 then 
   if [Answer] = [CorrectAnswers] then "Right"
   else if Text.Contains([CorrectAnswers], [Answer]) and not Text.Contains([Answer], [CorrectAnswers]) then "Lack of other answer"
   else "Wrong"
else
   if [Answer] = [CorrectAnswers] then "Right"
   else if Text.Length([Answer]) = Text.Length([CorrectAnswers]) then "Wrong order"
   else "Lack of other answer"),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"IsOrder", "CorrectAnswers"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"UserID", "Answer", "Custom", "QuestionID"})
in
    #"Reordered Columns"

El resultado final es el siguiente:

vjunyantmsft_3-1715130243528.png


Saludos
Dino Tao
Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Helpful resources

Announcements
LearnSurvey

Fabric certifications survey

Certification feedback opportunity for the community.

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.