Problema de tabla de datos dividida<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo un problema con la división de una tabla de datos y me preguntaba si alguien sabe cómo hacerlo. Mis datos se ven así:

Los datos deben dividirse por ID2 con IDENTIFICACIÓN siendo la variable del grupo. Cuando lo hago de esa manera termino con este resultado:

El problema es que para IDENTIFICACIÓN s 2 y 4 hay múltiples valores de C en la columna ID2 . Como parece, JMP siempre usa el último valor en la tabla de datos divididos.
¿Existe alguna forma automática de hacerlo para terminar con una tabla como la siguiente?

Aquí hay dos filas para los ID 2 y 4 que representan los diferentes valores de C en los datos originales.
¡Gracias por tu ayuda!
Sebastián
Re: Problema de tabla de datos divididagracias msharp ,
funciona muy bien.
y estás escribiendo, mantener las cosas simples es probablemente la mejor manera de hacerlo.
Re: Problema de tabla de datos divididaMe mantendría alejado de este enfoque en general, los datos estáticos son generalmente más seguros que los datos dinámicos. Hay que preguntarse ¿qué importancia tiene el orden de los datos?Esta solución mantendrá las claves en orden, pero los valores podrán moverse libremente.PERO...
Esa solución sólo funcionará con columnas numéricas.Si tuviéramos que reemplazar :ID2 con :ID2Num donde A's = 1, B's =2 ect. simplemente podría usar una declaración &, por lo tanto :Sum( :ID[Index( 1, Row() )] == :ID & :ID2Num[Index( 1, Row() )] == :ID2Num ) para la fórmula.
Si tienes columnas de caracteres tendrás que ser más creativo.Así para la fórmula:
longitud(elementos concat(:ID2[Índice( 1, Fila() )],"")) - longitud(sustituto(elementos concat(:ID2[Índice( 1, Fila() )],""), :ID2, ""))
o
dt1 << Nueva columna("Concat", Carácter, Nominal, Fórmula(:ID2 || char(:ID)));
dt1 << Nueva columna("Repetir", Carácter, Nominal, Fórmula((longitud(elementos concat(:Concat[Índice( 1, Fila() )],"")) - longitud(sustituir(elementos concat(:Concat[ Índice (1, Fila())],""), :Concat,"")))/2)); //el 2 al final representa la longitud de la cadena concatenada
Están sucediendo muchas cosas aquí y no tengo la energía para explicarlas ahora.Pero déjame saber si tienes preguntas; Realmente, hay una solución más simple y viable arriba.
Re: Problema de tabla de datos divididagracias msharp ,
por cierto, en una publicación anterior @ms ofreció esta fórmula para indexar :Sum( :ID[Index( 1, Row() )] == :ID ) @EM Ofreció esta fórmula para indexar :Sum( :ID[Index( 1, Row() )] == :ID )
Re: Sintaxis: ¿Cómo creo una columna de índice por ID?
¿Hay alguna manera de usarlo en este contexto? ¿Con dos columnas de índice y una de ellas es alfabética?
mejor,
ron
Re: Problema de tabla de datos divididaSimplemente combinando/resumiendo lo que se mencionó. Asegúrese de ordenar los datos de antemano o la función Lag() tendrá problemas.Además, usar una fórmula será más rápido que un comando para cada fila().Si le preocupa la clasificación de publicaciones que pueda afectar la función lag() más adelante, simplemente elimine la fórmula para evitar conflictos.De este modo:
NombresDefaultToHere ( 1 ) ;
// Mesa
dt1 = Nueva mesa ( "Sebastián" ,
Nueva columna ( "IDENTIFICACIÓN" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 2 , 2 ] )
) ,
Nueva columna ( "ID2" ,
Personaje ,
"Nominal" ,
Establecer valores (
{ "A" , "B" , "C" , "D" , "A" , "B" , "C" , "C" , "A" , "B" , "C" , "D" , "A" , "B" ,
"C" , "C" , "C" , "B" }
)
) ,
Nueva columna ( "Valor" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Establecer valores (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 , 777 , 888 ]
)
)
) ;
// la tabla debe ordenarse para que funcione la fórmula del siguiente paso
dt1 << Clasificar ( Reemplazar tabla ,
Por ( : IDENTIFICACIÓN , : ID2 ) ,
Orden ( Ascendente , Ascendente )
) ;
//Añadir una columna auxiliar
dt1 << Nueva columna ( "Repetir" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Fórmula ( Si ( : ID2 != Retraso ( : ID2 , 1 ) | Fila () == 1 , 1 , Retraso ( : Repetir , 1 ) + 1 ) )
) ;
: Repetir << Eliminar fórmula ; // más rápido que 'para cada fila()'
// Dividir
dt2 = dt1 << Dividir (
Dividir por ( : ID2 ) ,
Dividir ( : Valor ) ,
Grupo ( : IDENTIFICACIÓN , : Repetir )
) ;
// eliminar un auxiliar columna
dt2 << eliminarColumna ( : Repetir ) ;
Re: Problema de tabla de datos divididaHola sebastianhoffmeister ,
prueba esto:
dt = Nueva mesa ( "Datos originales" ,
Agregar filas ( dieciséis ) ,
Nueva columna ( "IDENTIFICACIÓN" ,
Numérico ,
Continuo ,
Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nueva columna ( "ID2" ,
Personaje ,
Nominal ,
Establecer valores (
{ "A" , "B" , "C" , "D" , "A" , "B" , "C" , "C" , "A" , "B" , "C" , "D" , "A" , "B" ,
"C" , "C" }
)
) ,
Nueva columna ( "Valor" ,
Numérico ,
Continuo ,
Formato ( "Mejor" , 12 ) ,
Establecer valores (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
// la tabla debe ordenarse para que funcione la fórmula del siguiente paso
dt << Clasificar ( Reemplazar tabla ,
Por ( : IDENTIFICACIÓN , : ID2 ) ,
Orden ( Ascendente , Ascendente )
) ;
// introduce un nuevo índice que reconocerá las duplicaciones
dt << nueva columna ( "ID3" ) ;
por cada fila ( Si ( // no use una fórmula en la columna ya que depende de la clasificación que puede cambiar más adelante.
Fila () == 1 , ID3 =: IDENTIFICACIÓN ,
: IDENTIFICACIÓN != Retraso ( : IDENTIFICACIÓN , 1 ) | : ID2 != Retraso ( : ID2 , 1 ) , ID3 = : IDENTIFICACIÓN ,
ID3 = Retraso ( : ID3 , 1 ) + 1
)) ;
// ahora puedes dividir la mesa
clasificado = dt << Dividir (
Dividir por ( : ID2 ) ,
Dividir ( : Valor ) ,
Grupo ( : ID3 , : IDENTIFICACIÓN ) ,
Tabla de salida ( "mesa dividida" )
) ;
mejor,
ron
Re: Problema de tabla de datos dividida¡Ups! Lo siento, sí Sebastián. ¿Quizás algo así?
//Añadir una columna auxiliar
Esperar ( 3 ) ;
dt1 << Nueva columna ( "Repetir" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Fórmula ( Si ( : ID2 != Retraso ( : ID2 , 1 ) | Fila () == 1 , 1 , Retraso ( : Repetir , 1 ) + 1 ) )
) ;
Re: Problema de tabla de datos dividida¡Gracias por el apoyo Ian!
Eso era más o menos lo que estaba haciendo. El problema en el mundo real es, por supuesto, que el conjunto de datos tiene ~3k filas y no podía imaginar una fórmula para crear la columna repetida automáticamente en lugar de manualmente.
¿Conoces una solución para eso también? Me gustaría evitar escribir un script que anide múltiples bucles for para generar la columna de "repetición". Eso suena tan ineficiente.
Gracias,
Sebastián
Re: Problema de tabla de datos divididaCreo que necesitas una columna auxiliar, Sebastián.
NombresDefaultToHere ( 1 ) ;
// Mesa
dt1 = Nueva mesa ( "Sebastián" ,
Agregar filas ( dieciséis ) ,
Nueva columna ( "IDENTIFICACIÓN" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nueva columna ( "ID2" ,
Personaje ,
"Nominal" ,
Establecer valores (
{ "A" , "B" , "C" , "D" , "A" , "B" , "C" , "C" , "A" , "B" , "C" , "D" , "A" , "B" ,
"C" , "C" }
)
) ,
Nueva columna ( "Valor" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Establecer valores (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
//Añadir una columna auxiliar
Esperar ( 3 ) ;
dt1 << Nueva columna ( "Repetir" ,
Numérico ,
"Nominal" ,
Formato ( "Mejor" , 12 ) ,
Establecer valores ( [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 ] )
) ;
// Dividir
dt2 = dt1 << Dividir (
Dividir por ( : ID2 ) ,
Dividir ( : Valor ) ,
Grupo ( : IDENTIFICACIÓN , : Repetir )
) ;
// Eliminar columna auxiliar
Esperar ( 3 ) ;
dt2 << eliminarColumna ( : Repetir ) ;