¿Cómo transpongo datos del formato largo al ancho?Soy un nuevo usuario de JMP.
Mis datos están actualmente en formato largo. En otras palabras, los sujetos tienen varias líneas de datos cada uno. Sin embargo, necesito que los datos estén en formato amplio para el análisis de supervivencia: 1 línea de datos por sujeto. Cuando intento utilizar Transpose, JMP me dice "No se puede transponer. Las columnas de datos tienen diferentes tipos de datos". Las variables son una mezcla de continuas y nominales. Entonces, ¿cómo se supone que debo hacer esto? Pude convertir un conjunto de datos diferente de ancho a largo sin dificultad, pero parece que no puedo hacer lo contrario.
Los datos actuales se configuran así (datos falsos):
ID Var1 Var2 Resultado
001 1 1 0
001 1 1 0
001 1 0 1
002 0 1 0
002 0 1 1
003 1 1 0
Lo quiero así:
ID Var1_hora1 Var2_hora1 Var1_hora2 Var2_hora2.... resultado_timex
001 1 1 1 1 1
002 0 1 0 1 1
003 1 1 . . 0
¡Gracias!
Re: ¿Cómo transpongo datos de formato largo a ancho?¡Gracias jeff! ¡Eso funciono!Re: ¿Cómo transpongo datos de formato largo a ancho?@ron_horne Tiene la solución correcta, pero quizás algunas imágenes ayuden.
Tablas -> Dividir reorganizará los datos de la forma que desee, pero requiere una columna que identifique las nuevas columnas. En su caso, desea crear columnas para cada fila dentro de ID, por lo que necesita una columna que cuente las filas dentro de ID.@ron_horne llamó a esta columna Índice .
También deberás asegurarte de que tus datos estén ordenados por IDENTIFICACIÓN para que esto funcione.
Estos son los datos que presentó en su primera publicación en forma de tabla de datos JMP.

A estos datos debemos sumarle el Índice columna.@ron_horne Usé una fórmula diferente para su columna Índice, pero me gusta algo un poco más sencillo.

La fórmula anterior es:
If( :ID != Lag( :ID, 1 ), 1, Lag( :Index, 1 ) + 1)
En prosa, esto dice que si el valor de ID en la fila actual no es el mismo que el ID de la fila anterior (es decir, Retraso ( :ID, 1) ) luego ponga un 1 en el Índice columna; de lo contrario, tome el valor de la Índice columna de la fila anterior (es decir, Retraso (:Índice, 1) )
Como puedes ver, el Índice columna en la tabla de datos ahora cuenta las filas dentro IDENTIFICACIÓN .

Ahora podemos usar Tablas->Dividir para dividir tu Var1 , Var2 y Resultado columnas por Índice y agrupar las filas por IDENTIFICACIÓN .

Eso le dará esta tabla de datos, que creo que es lo que desea. Tiene nuevas columnas para cada fila dentro de ID y una fila por ID.

Podría ser más fácil ver un ejemplo más simple en el que no tenemos que crear la columna Dividir por. Aquí tenéis un vídeo que lo demuestra.
Avíseme si me equivoqué o si todavía está confundido.
Re: ¿Cómo transpongo datos de formato largo a ancho?Última oportunidad,
1) el primer comando simplemente crea una fuente de datos original en formato largo.
2) el segundo comando introduce un índice para el número del evento para cada ID. No es necesario que el número de eventos sea igual para cada ID. pero, si algunos ID tienen menos eventos, les faltarán valores en el formato de tabla amplia.
3) el tercer comando aprovecha las columnas de índice e ID para dividir la tabla de la forma que usted lo solicitó. una columna para cada evento y variable y cada fila representa solo una ID.
en sus datos solo necesita ejecutar los dos últimos comandos.
names default to here(1);
// source data table
dt = New Table( "Long",
Add Rows( 7 ),
New Column( "ID",
Numeric,
Continuous,
Format( "Best", 5 ),
Set Values( [1, 1, 1, 2, 2, 3, 3] )
),
New Column( "Var1",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 1, 0, 0, 1, 1] )
),
New Column( "Var2",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 0, 1, 1, 1, 0] )
),
New Column( "Outcome",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [0, 0, 1, 1, 1, 0, 0] )
)
);
// add index column for spliting - no need to sort the table first
dt << new column ("index", formula(Sum( :ID[Index( 1, Row() )] == :ID ) ) );
// now split by index and group by ID
dt << Split(
Split By( :index ),
Split( :Var1, :Var2, :Outcome ),
Group( :ID ),
Output Table( "Wide" )
);
Re: ¿Cómo transpongo datos de formato largo a ancho?Este código me dio 2 tablas. El primero se llamaba "Fuente" y sólo tenía 10 filas de datos y 5 columnas. La columna de ID va del 1 al 4 (no mis ID) y la ID aparece en 3 filas. Realmente no sé qué se suponía que debía hacer esto. Todos los datos son binarios, incluso mis variables de fecha. La segunda tabla "sin título" tenía 4 filas de datos y 4 columnas. La identificación va del 1 al 4 en las filas y todas las columnas están etiquetadas como faltantes.
No creo que esto esté haciendo lo que quiero.
Re: ¿Cómo transpongo datos de formato largo a ancho?Si ejecutó todo el script tal como está y el resultado es lo que busca, puede reproducirlo en su conjunto de datos con solo unos pocos clics.
1) agregue una nueva columna y llámela "índice".
2) establezca su fórmula en la siguiente: Suma( :ID[Index( 1, Row() )] == :ID )
3) Tabls >> Dividir y llenarlo como tal.

Haga clic en Aceptar y debería haber terminado.
Mejor,
ron
Re: ¿Cómo transpongo datos de formato largo a ancho?Bien, soy nuevo en JMP y nunca he usado JSL, aunque he hecho mucha programación en SPSS, SAS y algunos otros. No sigo las secuencias de comandos en absoluto en este ejemplo, especialmente los "valores establecidos". Creo que el siguiente bloque de comandos intenta crear nuevas variables de índice para agrupar antes de dividir.
Creé algunas variables al pasar de ancho a largo en otro conjunto de datos, pero en ese caso, todos los sujetos tenían la misma cantidad de observaciones.
Re: ¿Cómo transpongo datos de formato largo a ancho?Perdón por no verificar primero.
Prueba lo siguiente
los nombres por defecto están aquí ( 1 ) ;
// tabla de datos fuente
dt = Nueva tabla ( "fuente",
Agregar filas ( 10 ) ,
Nueva columna ( "IDENTIFICACIÓN ",
Numérico,
Continuo,
Formato ( "Mejor", 5 ) ,
Establecer valores ( [ 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 4 ] )
) ,
Nueva columna ( "Var1 ",
Numérico,
Continuo,
Formato ( "Mejor", 12 ) ,
Establecer valores ( [ 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 ] )
) ,
Nueva columna ( "Var2 ",
Numérico,
Continuo,
Formato ( "Mejor", 12 ) ,
Establecer valores ( [ 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 ] )
) ,
Nueva columna ( "Resultado",
Numérico,
Continuo,
Formato ( "Mejor", 12 ) ,
Establecer valores ( [ 0 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1 ] )
)
) ;
// agrega una columna de índice para dividir; no es necesario ordenar la tabla primero
dt << nueva columna ( "índice", fórmula ( Suma ( :IDENTIFICACIÓN [ Índice ( 1 , Fila () )] == :identificación ) ) ) ;
// ahora dividido por índice y grupo por ID
dt<< Dividir (
Dividir por ( :índice ) ,
Dividir ( :Var1, :Var2, :Resultado ) ,
Grupo ( :IDENTIFICACIÓN )
) ;
Re: ¿Cómo transpongo datos de formato largo a ancho?No estoy seguro de qué está pasando entonces. Los datos están ordenados por ID. Cuando divido por ID y uso mis vars como "columnas divididas", termino con 14 líneas de datos y una columna para cada combinación de ID/variable.
Estoy intentando conseguir:
ID visita1 visita 2 .... visita13 resultado1 resultado2 ... resultado 13
001 13/9 20/10... 3/2 0 0... 1
002 7/04 8/12 ... 12/5 0 1 ... 1
Lo que estoy obteniendo es
Fecha1-ID001 Fecha1-ID002
Línea 1 13/9 04/7
Línea 2 20/10 12/8
Gracias,
José
Re: ¿Cómo transpongo datos de formato largo a ancho?
Vaya... Creo que puedes resolver el problema si usas el Grupo y colocas tu columna de ID allí también.
Si sus datos están ordenados por ID (todos los datos de un ID determinado están juntos). Si no está ordenado, vaya a Tablas==>Ordenar y ordene los datos por ID. Luego, al seleccionarla como su columna "Dividir por", y su Var1, Var2, Resultado como sus "Columnas divididas", obtendrá una tabla de datos con una fila por valor de la columna Dividir por, y luego obtendrá Var1 001, Var1 002. ......Var1 013, Var2 001, Var2 002.......Var2 013, Resultado 001, Resultado 002......Resultado 013.
Dado que puedes tener hasta 13 niveles.
Re: ¿Cómo transpongo datos de formato largo a ancho?Gracias, Ron, pero no estoy haciendo simples resúmenes. Estoy trabajando en un análisis de supervivencia. Mi primer paso es convertir los datos en formato ancho.
JoséRe: ¿Cómo transpongo datos de formato largo a ancho?Gracias, Jim. Eso funcionó en parte. Sin embargo, en lugar de obtener una fila para cada ID de objeto (n=15,000), terminé con 14 filas de datos y cada nombre de variable tiene el ID de sujeto adjunto.
Mis datos están organizados SubjectID. Dentro de eso, los sujetos pueden tener múltiples líneas de datos (códigos de tratamiento) para cada visita. En formato largo, hay entre 1 y 13 líneas de datos por tema.
¿Deberían utilizarse múltiples variables "divididas por"? ¿Debería utilizarse "agrupar por"?
Gracias,
José
Re: ¿Cómo transpongo datos de formato largo a ancho?Jim tiene razón. Sin embargo, si está haciendo esto solo para producir resúmenes de los datos por ID, puede guardar este paso usando Tablas >>> resumen.
mejor,
ron
Re: ¿Cómo transpongo datos de formato largo a ancho?Lo que quieres hacer es usar
Tablas ==> Dividir
Puede dividir por ID y especificar var1,var2 y resultado como columnas divididasRe: ¿Cómo transpongo datos del formato largo al ancho?Sé que este es un hilo antiguo, pero tengo una pregunta. Esto me funcionó, excepto que cuando intento crear la columna de índice, está en blanco para el primer ID. Así es como se ve.
¿Alguien sabe qué podría estar causando esto?

Re: ¿Cómo transpongo datos del formato largo al ancho?Aquí hay un enfoque para conseguir lo que quieres.
If( Row() == 1,
theVal = 1,
If( Lag( :yourColumn ) != :yourColumn,
theVal
++)
);
theVal;
Re: ¿Cómo transpongo datos del formato largo al ancho?Hola,
¿Dónde se supone que debo colocar esta fórmula? ¿En la misma columna de índice? ¿Tengo que cambiar "yourColumn" por algo?
Re: ¿Cómo transpongo datos del formato largo al ancho?La fórmula que especifiqué se colocaría en la columna Índice.
Es necesario cambiar "yourColumn" por el nombre de la columna donde desea incrementar el valor de la columna de índice cuando se cambia la columna.