Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaHola a todos, tengo 2 tablas de datos. La tabla de mi conjunto de datos "Dataset.jmp" tenía los datos de la columna como código "ENICITY" y "ETHCAT" que necesito vincular con el conjunto de datos "Dictionary.jmp" que puede cambiar el código en etiquetas (en la columna Etiquetas del archivo Diccionario). Mi conjunto de datos real tenía 50 categorías, por lo que no puedo usar la función "Etiquetas de valor" de todas las categorías. ¿Alguna idea para vincular la fila de una tabla a la columna de otra tabla con el valor exacto? La columna que quiero es la columna de resultados en el archivo Dataset.jmp
Adjunto los archivos aquí.
¡Muchas gracias!
Mejor,
Análisis y modelado de datos básicosRe: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaCon match f solo tienes que listar las columnas donde hay un cambio, las columnas restantes permanecen como 'col' (última entrada).
Si no desea iniciar una asignación, simplemente utilice nombres coincidentes para las columnas y el diccionario.
Como alternativa, utilice una asignación consistente (como: el primer carácter del nombre de la columna o los primeros 2 caracteres) y una ecuación correspondiente.
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaGracias Hogi, Sin embargo, ¿puedes proporcionar el script que no necesita volver a escribir todas las columnas que tenemos (más de 50 columnas)?
Gracias !
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaComo otra alternativa, sin ningún subconjunto/Para cada uno:
names default to here(1);
dict = Open( "$DOWNLOADS/Dictionary1.jmp" );
dt = Open( "$DOWNLOADS/Dataset1.jmp" );
// stack the data for easy application of the dictionary
dt2=dt << Stack(
columns(
:ETHNICITY, :ETHCAT, :SEX, :NAME, :"A09:05"n, :"A01:01"n, :DPA05, :DPB04
),
Source Label Column( "col" ),
Stacked Data Column( "values" )
);
// add a column with the corrected column-identifiers
dt 2 << New Column( "column",
Character,
Formula(
Match( :col,
"A01:01", "A",
"A09:05", "A",
"DPA05", "DP",
"DPB04", "DP",
:col
)
)
);
<BR />// add the labels from the disctionary
dt2 <<
Update(
With( dict ),
Match Columns( :column = :Column, :values = :Values ),
Add Columns from Update Table( :Labels )
);<BR />
// convert back to a wide table
dt2 <<
Split(
Split By( :col ),
Split( :Labels ),
Group( :ID ),
Remaining Columns( Drop All )
);
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaPara este caso, simplemente agregue una asignación para obtener el subconjunto correcto, por ejemplo, en el código Jarmos:
colMapping = Associative array({{"SEX","SEX"},{"NAME","NAME"},{"A09:05","A"},{"A01:01","A"},{"DPA05","DP"},{"DPB04","DP"}});
colIndex= colMapping[col];
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == colIndex)), Selected Columns(0), Invisible);
Idea alternativa: Hay una funcionalidad en Recode que se acerca bastante a lo que quieres: Aplicar mapeo desde tabla


Por el momento, no tiene una configuración para especificar el subconjunto correcto. Por lo tanto, si aplica estas asignaciones con regularidad (y otros usuarios también lo hacen), es posible que desee publicar un deseo en la Lista de deseos para mejorar la función con dicha configuración...
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaGracias, Jim y Jarmo,
Aprendo mucho de la comunidad de discusión. Gracias por tu ayuda, intenté encontrar temas relacionados con lo que quiero hacer y obtuve las respuestas de esta comunidad. Los scripts que JIM y tú me dan funcionan. Sin embargo, mis datos reales son más complicados que los ejemplos. Por ejemplo, si uso el mismo diccionario con varias columnas en el conjunto de datos, como si adjuntara el nuevo conjunto de datos1 y el diccionario1. ¿Puedes corregir el script para esto, si una columna se comparte con otras columnas en el mismo patrón? Como el diccionario A y las columnas A01, A08, A9,...
Adjunto el nuevo conjunto de datos aquí.
Mejor,
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaDefinitivamente comenzaría con la solución proporcionada por Jim, ya que utiliza más JSL provisto por JMP, pero esto es algo que escribiría después de mucha experiencia con JSL y JMP (parte de mi trabajo es automatizar JMP con scripts y agregar características adicionales a JMP con JSL...)
Ver más...
Names Default To Here(1);
dt_data = Open("$DOWNLOADS/Dataset.jmp");
dt_dict = Open("$DOWNLOADS/Dictionary.jmp");
Column(dt_dict, "Values") << Set Data Type("Numeric");
/*
// Not really sure if this "fix" should be done or not
missing_rows = Loc(dt_dict[0, "Values"], .);
If(N Rows(missing_rows) > 0,
dt_dict[missing_rows, "Values"] = 0;
);
*/
Summarize(dt_dict, cols = By(:Column));
For Each({col}, cols,
dt_dict_subset = dt_dict << Subset(Rows(dt_dict << get rows where(:Column == col)), Selected Columns(0), Invisible);
Column(dt_dict_subset, "Labels") << Set Name("Result " || col);
dt_data << Update(
With(dt_dict_subset),
Match Columns(Eval(col) = :Values),
Add Columns from Update Table(Eval("Result " || col))
);
Close(dt_dict_subset, no save);
);
Write();
En primer lugar, debes comprender por completo la opción que Jim ofrece. Luego, tal vez puedas comenzar a pensar en utilizar algo como esto (si tienes conocimientos de programación), ya que esto básicamente omite la mayor parte del código que JMP puede proporcionarte (la mayor parte de Open() y << Update son proporcionados por JMP).
No pases directamente a mi solución antes de seguir los pasos anteriores si deseas aprender JSL y cómo automatizar JMP.
- Comience con scripts proporcionados exclusivamente por JMP
- Mejorarlos ligeramente (por ejemplo, utilizar variables en lugar de nombres de tablas "codificados")
- Empiece a agregar algo de "programación" a la mezcla. Aquí es donde considero que pertenece la solución de Jim (por ejemplo, un bucle que JMP probablemente no pueda proporcionarle y utilizar la función Word())
- Finalmente termino con algo parecido a mi solución que todavía utiliza parcialmente JSL proporcionado por JMP (apertura de tablas, actualización de tablas)
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaEste es un buen comienzo para lo que desea. Debería poder ampliarlo para satisfacer las discrepancias en sus requisitos finales.
Si no se ha tomado el tiempo de leer la Guía de creación de scripts disponible en la Ayuda de JMP, le recomiendo encarecidamente que lo haga. Además, asegúrese de estudiar el ejemplo siguiente para comprender la lógica y los detalles de las funciones y las instrucciones.
names default to here(1);
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
dt = Open( "$Downloads/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
dtDict = Open( "$Downloads/Dictionary.jmp" );
/*// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );*/
// Change column modeling type: Values
Data Table( "Dictionary" ):Values << Set Modeling Type( "Continuous" );
// Create a new dictionary data table for each level of the Column column
dtDictList = dtDict << Subset(
By( :Column ),
All rows,
Selected columns( 0 ),
Selected rows( 0 )
);
/*// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );*/
// Clear row selection
//Data Table( "Dataset.jmp" ) << Clear Select;
dt << Clear Column Selection();
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
/*// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );*/
For Each( {thedt, index}, dtDictList,
// Get the dataset column to join with
joinColumn = Word( 3, Char( thedt ), "=\!"" );
// Join data tables
// → Data Table( "untitled 1925" )
newDT = dt << Join(
With( thedt ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( Column( joinColumn ) = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Join of Dataset with Column=ETHCAT" )
);
NewDt:Labels << set name( joinColumn || " Labels" );
NewDt:Values << set name( joinColumn || " Values" );
If( index > 1,
Close( dt, nosave )
);
dt = newDT;
);Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaHola Jim, muchas gracias. Tus sugerencias funcionan bien. Sin embargo, si tengo un diccionario de 150 filas con diferentes categorías (varias de 5 a 30 grupos, como ETHCAT, ETHNICITY, etc.) y una columna en la tabla del conjunto de datos que necesita unirse con 300 columnas. Para ser honesto, es difícil hacerlo manualmente y tengo varias tablas que se unen. ¿Puedes proporcionar el script sobre 1. Cómo categorizar lo mismo en un archivo de diccionario y cómo unir todas las columnas del conjunto de datos con un solo archivo de diccionario? Este es el script que intento hacer. Sin embargo, no puedo modificar los scripts.
// Open Data Table: Dataset.jmp
// → Data Table( "Dataset.jmp" )
Open( "$DOWNLOADS/Dataset.jmp" );
// Open Data Table: Dictionary.jmp
// → Data Table( "Dictionary.jmp" )
Open( "$DOWNLOADS/Dictionary.jmp" );
// Subset data table
// → Data Table( "Subset of Dictionary" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 1, 10 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Subset data table
// → Data Table( "Subset of Dictionary 2" )
Data Table( "Dictionary.jmp" ) << Clear Select << Select Rows( Index( 11, 14 ) ) <<
Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
// Change column info: Values
Data Table( "Subset of Dictionary 2" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Change column info: Values
Data Table( "Dictionary.jmp" ):Values << Data Type( Numeric ) <<
Set Field Width( 12 );
// Clear row selection
Data Table( "Dataset.jmp" ) << Clear Select;
// Change column modeling type: ETHNICITY
Data Table( "Dataset.jmp" ):ETHNICITY << Set Modeling Type( "Continuous" );
// Change column modeling type: ETHCAT
Data Table( "Dataset.jmp" ):ETHCAT << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Subset of Dictionary 2" ):Values << Set Modeling Type( "Continuous" );
// Change column modeling type: Values
Data Table( "Dictionary.jmp" ):Values << Set Modeling Type( "Continuous" );
// Join data tables
// → Data Table( "untitled 1925" )
Data Table( "Dataset.jmp" ) << Join(
With( Data Table( "Subset of Dictionary 2" ) ),
By Matching Columns( :ETHCAT = :Values ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 )
);
Muchas gracias,
Mejor,
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tabla¿Por qué la cantidad de filas y columnas crearía un problema? Si la cantidad de búsquedas diferentes (ETHCAT, ETHNICITY, etc.) es mayor, la creación de subconjuntos y la combinación simplemente se tendrían que colocar en un bucle. Sin embargo, el comienzo es hacerlo de manera interactiva para 1 o 2 grupos y luego tomar el JSL que JMP produce para realizar esas operaciones y colocarlas en un script. Luego, se puede agregar el bucle de los pasos al script.
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaPodrías utilizar uniones virtuales a través de las propiedades de la columna.
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaHola Jim, gracias por tu idea. Sin embargo, tengo más de 50 columnas y 1000 filas. ¿Tienes alguna idea sobre un conjunto de datos más grande?
Mejor,
Re: Cómo vincular el código de columna de una tabla a otro conjunto de datos de tablaExaminar
Tablas=>Unir
Tabla de datos del subconjunto Diccionario por la columna Columna en una tabla para ETHCAT y otra para ETHNICITY. Cambie la columna Valor a una columna numérica. Para la tabla de datos ETHNICITY, el valor Nulo o Faltante debe expandirse en 2 filas con Valor con el valor . y una con el valor 0
Unir cada una de las subtablas a la tabla de datos denominada conjunto de datos, uniendo ETHNICITY con Value para una tabla y ETHCAT con Value para la segunda tabla.