Comment lier le code de colonne d'une table à un autre ensemble de données de tableBonjour à tous, j'ai 2 tables de données. Ma table de jeu de données "Dataset.jmp" avait les données de colonne comme code "ENICITY" et "ETHCAT" que je dois lier au jeu de données "Dictionary.jmp" qui peut changer le code en étiquettes (dans la colonne Étiquettes du fichier Dictionnaire). Mon jeu de données actuel avait 50 catégories, je ne peux donc pas utiliser la fonction "Étiquettes de valeur" de toutes les catégories. Une idée pour lier la ligne d'une table à la colonne d'une autre table avec la valeur exacte ? la colonne que je veux est la colonne de résultat sur le fichier Dataset.jmp
J'ai joint les fichiers ici.
Merci beaucoup!
Meilleur,
Analyse et modélisation de données de baseRé: Comment lier le code de colonne d'une table à un autre ensemble de données de tableAvec match fyou, il suffit de lister les colonnes où il y a un changement, les colonnes restantes restent « col » - dernière entrée.
Si vous ne souhaitez pas démarrer un mappage, utilisez simplement des noms correspondants pour les colonnes et le dictionnaire.
Vous pouvez également utiliser un mappage cohérent (comme : le premier caractère du nom de la colonne ou les 2 premiers caractères) et une équation correspondante.
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableMerci Hogi, Cependant, pouvez-vous fournir le script qui n'a pas besoin de retaper toutes les colonnes que nous avons (plus de 50 colonnes) ?
Merci !
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableComme autre alternative - sans aucun sous-ensemble/Pour chaque :
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 )
);
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tablePour ce cas, ajoutez simplement un mappage pour obtenir le bon sous-ensemble, par exemple dans le code 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);
Idée alternative : il existe une fonctionnalité dans Recode qui se rapproche assez de ce que vous souhaitez : appliquer le mappage à partir d'une table


Pour le moment, il n'existe pas de paramètre permettant de spécifier le sous-ensemble approprié. Par conséquent, si vous appliquez régulièrement de tels mappages - et que d'autres utilisateurs le font également - vous souhaiterez peut-être publier un souhait dans la liste de souhaits pour améliorer la fonction par un tel paramètre...
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableMerci, Jim et Jarmo,
J'apprends beaucoup de la communauté de discussion. Merci pour votre aide, j'ai essayé de trouver des sujets liés à ce que je veux faire et j'ai obtenu les réponses de cette communauté. Les scripts que JIM et vous me donnez fonctionnent. Cependant, mes données réelles sont plus compliquées que les exemples. Par exemple, si j'utilise le même dictionnaire avec plusieurs colonnes dans l'ensemble de données, comme si j'avais joint le nouveau dataset1 et le dictionnaire1. Pouvez-vous corriger le script pour cela, si 1 colonne est partagée avec d'autres colonnes dans le même modèle ? Comme le dictionnaire A et les colonnes A01, A08, A9,...
J'ai joint le nouvel ensemble de données ici.
Meilleur,
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableJe commencerais certainement par la solution fournie par Jim car elle utilise davantage le JSL fourni par JMP, mais c'est quelque chose que j'écrirais après beaucoup d'expérience avec JSL et JMP (une partie de mon travail consiste à automatiser JMP avec des scripts et à ajouter des fonctionnalités supplémentaires à JMP avec JSL...)
Voir plus...
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();
Tout d'abord, vous devez absolument comprendre parfaitement l'option fournie par Jim. Ensuite, vous pouvez peut-être commencer à réfléchir à l'utilisation de quelque chose comme cela (si vous avez une compréhension approximative de la programmation), car cela revient à ignorer la plupart du code que JMP peut vous fournir (la plupart des Open() et << Update sont fournis par JMP).
Ne passez pas directement à ma solution avant de suivre les étapes précédentes si vous souhaitez apprendre JSL et comment automatiser JMP
- Commencez avec des scripts purement fournis par JMP
- Améliorez-les légèrement (par exemple, utilisez des variables au lieu de noms de table « codés en dur »)
- Commencez à ajouter un peu de « programmation » au mélange. C'est là que je considérerais que la solution de Jim appartient (par exemple une boucle que JMP ne pourra probablement pas vous fournir et en utilisant la fonction Word())
- J'ai finalement obtenu quelque chose comme ma solution qui utilise toujours partiellement le JSL fourni par JMP (ouverture de tables, mise à jour de la table)
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableVoici un bon début de ce que vous souhaitez. Vous devriez pouvoir développer cela pour répondre aux divergences par rapport à vos exigences finales.
Si vous n'avez pas pris le temps de lire le Guide de script disponible dans l'Aide JMP, je vous suggère fortement de le faire. Assurez-vous également d'étudier l'exemple ci-dessous, afin de comprendre la logique et les spécificités des fonctions et des instructions.
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;
);Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableBonjour Jim, Merci beaucoup. Vos suggestions fonctionnent bien. Cependant, si j'ai un dictionnaire de 150 lignes avec différentes catégories (de 5 à 30 groupes, tels que ETHCAT, ETHNICITY, etc.) et une colonne sur la table de l'ensemble de données qui doit être jointe à 300 colonnes. Pour être honnête, il est difficile de le faire manuellement et j'ai plusieurs tables qui se rejoignent. Pouvez-vous fournir le script sur 1. Comment catégoriser la même chose dans un fichier de dictionnaire et comment joindre toutes les colonnes de l'ensemble de données avec un seul fichier de dictionnaire. C'est le script que j'essaie de faire. Cependant, je ne peux pas modifier les 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 )
);
Merci beaucoup,
Meilleur,
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tablePourquoi le nombre de lignes et de colonnes créerait-il un problème ? Si le nombre de recherches différentes (ETHCAT, ETHNICITY, etc.) est plus élevé, le sous-ensemble et la fusion devraient simplement être placés dans une boucle. Cependant, le début consiste à le faire de manière interactive pour 1 ou 2 groupes, puis à prendre le JSL que JMP produit pour effectuer ces opérations et à les placer dans un script. Ensuite, la boucle des étapes peut être ajoutée au script.
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableVous pouvez utiliser des jointures virtuelles via les propriétés de colonne.
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableBonjour Jim, merci pour votre idée. Cependant, j'ai plus de 50 colonnes et 1000 lignes, avez-vous une idée pour un ensemble de données plus grand ?
Meilleur,
Ré: Comment lier le code de colonne d'une table à un autre ensemble de données de tableExaminer
Tables=>Rejoindre
Divisez le tableau de données du dictionnaire par la colonne Column en un tableau pour ETHCAT et un pour ETHNICITY. Modifiez la colonne Value en une colonne numérique. Pour le tableau de données ETHNICITY, la valeur Null ou Missing doit être étendue en 2 lignes avec Value ayant la valeur . et une ayant la valeur 0
Joignez chacune des tables sous-ensembles à la table de données appelée ensemble de données, en joignant ETHNICITY avec Value pour la première table et ETHCAT avec Value pour la deuxième table.