Déplacement d'un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionJe suis désolé d'avoir publié ceci à nouveau. J'ai posté des morceaux de mon flux de travail, masqués, ici, pour obtenir de l'aide, et j'ai encore du mal. J'ai du mal à vérifier les réponses car j'ai eu de mauvaises expériences sur StackOverflow en me faisant crier dessus et autres sans raison réelle. Je suis sûr que les cicatrices guérissent avec le temps. Quoi qu'il en soit, je suis là et j'arriverai éventuellement à vos réponses.
Pour arriver au point technique:
J'essaie de copier les dates auxquelles certains échantillons ont été exécutés (chaque échantillon aurait dû être exécuté à 3 reprises en supposant que tout s'est bien passé pendant la partie laboratoire du projet, pour laquelle je n'étais pas là) dans trois colonnes distinctes d'un fichier manifeste qui garde une trace des métadonnées en cours pour notre projet, à partir de ce que j'ai glané, de sorte que chaque colonne est une instance de collecte de données. Il y a plusieurs donateurs chacun avec un identifiant de donateur, et une certaine redondance dans les données comme plusieurs canaux de collecte sur l'instrument pour le "même point de données" (dépend de la façon dont vous le regardez), même si je pense que cela devrait être tout.
Voici mon pseudocode sur lequel j'ai essayé de travailler et il a été difficile jusqu'à présent. Je ne sais pas pourquoi. Je ne suis pas un informaticien chevronné, un développeur ou un ingénieur logiciel. Toute aide est appréciée.
DataTypes:
(associative array) DonorID{
(key) Month1: (value) date1 (empty at start)
(key) Month2: (value) date2 (empty at start)
(key) Month3: (value) date3 (empty at start)
}
find unique donor IDs in data
for each donor ID{
get (i.e. subset) data keyed on donor ID;
for Month in 1, 2, 3 (strings){
if no date in donorID associative array{
add date from data;
}else if date already{
is the date in the data table cell the same as in the associative array entry?
if yes, do nothing (indicates different target channel)
if no, ping user
Multiple run dates for same data point is a problem.
}
}
}
Copy from data to manifest:
loop over DonorID associative array:
for each donorID:
in Month 1, 2, or 3:
add date1 2 or 3 to "Actual Month [1, 2, or 3] Stability Test Date" in manifest
donorID is still row identifier
date (1, 2, or 3) is now column identifierScriptingRe: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionSalut,
Bienvenue dans la communauté! Je suis désolé que vous ayez eu des expériences négatives sur d'autres forums lorsque vous avez demandé de l'aide. Bien que la communauté des utilisateurs JMP soit un lieu accueillant et utile, il existe quelques «meilleures pratiques» qui devraient maximiser vos chances d'obtenir les informations que vous recherchez.
Poser des questions spécifiques, vice plus générales, est la voie à suivre si vous pouvez réussir - même si je me rends compte que parfois on «ne sait pas ce (s) qu'il ne sait pas». Publier un morceau considérable de pseudocode peut effrayer les gens ... si vous ne pouvez poser votre question d'aucune autre manière, il sera grandement utile de joindre un fichier «avant» et «après» - et des captures d'écran - pour que les téléspectateurs aient du concret exemples d'une table «de début» (ou de données texte) et d'une table «de fin». Cela ferait certainement une réelle différence dans ce cas particulier. Si vous devez «nettoyer» les ensembles de données, c'est très bien (mieux, vraiment). Tant que le point que vous essayez d'illustrer peut encore être fait, tout va bien.
Si vous posez des questions spécifiques et bien ciblées et incluez des fichiers illustratifs et des captures d'écran, il y a de fortes chances que beaucoup d'entre eux se joignent à vous pour vous aider. Je peux penser à plus que quelques désinvoltes qui ne peuvent pas vraiment résister à ça!
Acclamations,
Brady
Re: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionMerci, Brady.Re: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionSalut à tous. Voici mon code pour l'instant:
Names Default To Here( 1 );
dt_data = Open( "[filepath, no issues here]" );
dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
Write( ID ); //just a check; works
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data); //does not work
//...continue with further code to transfer from LBCM_array to manifest
);
);Je l'ai nettoyé pour qu'il soit confidentiel (pas de soucis d'espionnage sur les informations d'entreprise;)) tout en conservant la structure et les informations (nom 'un' nom, étiquette à étiqueter).
Mon problème est avec cette ligne pour le moment:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Il jette le message d'erreur
.
Name Unresolved: Run date in access or evaluation of 'Run date' , :Run date/*###*/
In the following script, error marked by /*###*/
...
data_array[data] = :Run date/*###*/ <<WHERE></WHERE>
: La date d'exécution est une colonne de données (en-tête) dans ma table de données (en particulier, dt_data) avec les dates d'exécution de l'expérience. J'essaie de les transférer dans le deuxième fichier, car chaque point de données aurait dû être collecté trois / trois fois et c'est pourquoi data_array a trois clés et trois valeurs vides lorsqu'il est initialisé. C'est là que vont les données, ce tableau associatif (data_array). Il est ensuite transféré dans dt_manifest mais c'est pour plus tard, une fois que cette partie fonctionne.
Pour l'instant, il semble que j'ai du mal à accéder, dans la ligne
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
la sélection appropriée de lignes et de colonnes qui m'intéresse. L'énoncé du problème est-il suffisamment clair à ce stade pour que n'importe qui dans l'auditoire puisse présenter et offrir une solution ou une contribution sur la façon de spécifier d'une manière plus syntaxiquement (et peut-être sémantiquement) correcte comment sélectionner le sous-ensemble de données que je suis intéressé par (de data_dt)?
Ne vous inquiétez pas du problème de transposition. J'aborderai cela plus tard, et je pense honnêtement que cela devrait être assez facile une fois que les données sont dans un aa (tableau associatif). À ce stade, j'apprends encore à manipuler les sélections de lignes / colonnes, des sous-ensembles de tables de données, etc., des problèmes liés.
Une dernière remarque: s'il semble étrange que les dates, les données et les tableaux soient mélangés, c'est probablement parce que j'ai choisi de mauvais noms pour les titres / étiquettes de nettoyage / anonymisation des colonnes de données ou des entités de données pertinentes pour protéger les secrets de mon entreprise. Je suis toujours une recrue dans tout ce processus, je dirais, et je préfère faire preuve de prudence.
Je continuerai à travailler sur le problème de mon côté.
Merci beaucoup,
Mike
Re: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionMike,
Je reste un peu perdu sur la raison pour laquelle vous souhaitez utiliser un tableau associatif, mais peu importe, je pense que le code ci-dessous se déplacera dans le tableau, les valeurs de date pour les 3 lignes de mesure pour chaque ID.J'ai créé des données qui, je l'espère, ressemblent à la mise en page de vos données.Je ne fais que des suppositions basées sur vos déclarations et l'utilisation du code.

Voici le script.La table de données ci-dessus est générée au début du script, donc les tripes de votre code, avec mes modifications, viennent en dessous de la génération de la table de données.
Names Default To Here( 1 );
dt_data = New Table( "Example",
Add Rows( 6 ),
New Column( "ID", Character, "Nominal", Set Values( {"A", "A", "A", "B", "B", "B"} ) ),
New Column( "Run Date",
Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Values( [3692304000, 3694982400, 3697401600, 3700080000, 3702672000, 3705350400] )
),
New Column( "TimePoint", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., ., ., ., ., .] ) )
);
//dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
theRows = dt_data << get rows where( :ID == ID );
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} );
k=0;
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
k++;
show( ID ); //just a check; works
data_array[data] = :Run date[theRows[k]];
//...continue with further code to transfer from LBCM_array to manifest
);
show(data_array);
);
Les résultats du code sont répertoriés dans le journal
ID = "A";
ID = "A";
ID = "A";
data_array = ["data1" => 3692304000, "data2" => 3694982400, "data3" => 3697401600];
ID = "B";
ID = "B";
ID = "B";
data_array = ["data1" => 3700080000, "data2" => 3702672000, "data3" => 3705350400];
Les nombres dans le data_array sont les valeurs numériques des dates d'exécution.
Re: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionSalut,
Vous écrivez:
Mon problème est avec cette ligne pour le moment:
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
Je vois quelques problèmes potentiels ... assurez-vous de les examiner:
1): La date d'exécution, telle qu'elle est écrite, fait référence à une colonne de la table de données actuelle au moment où cette ligne de code est interprétée. Il semble d'après le message d'erreur qu'au moment de l'interprétation de cette ligne de code, la table de données actuelle ne contient pas de colonne appelée "Date d'exécution". Je vois que vous ouvrez deux tables; assurez-vous toujours que la table prévue est bien la table courante, si vous laissez à JMP le choix de la table à utiliser. Vous pouvez forcer n'importe quelle table que vous souhaitez à être la table actuelle, à l'aide de la commande Table de données actuelle:
dt1 = open("firstfile");
dt2 = open("secondfile");
Current Data Table (dt1); // sets first table current
Current Data Table (dt2); //sets second table current
Vous n'avez cependant pas besoin de laisser à JMP le soin de décider. Vous pouvez spécifier explicitement la table à utiliser, actuelle ou non, à l'aide d'un table: colonne format, comme dans:
dt1:Run Date
2) Une fois que vous avez résolu le problème de devise de la table, vous devrez utiliser le << obtenir des lignes où () message, envoyé à la table de données appropriée, pour renvoyer des lignes répondant à certains critères. Souvent, ceux-ci sont utilisés comme indices, comme dans votre cas. En supposant que vous souhaitiez travailler avec dt1, le code apparaîtra alors comme suit:
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
Cette ligne fait 3 tâches:
1) Obtient les lignes de dt1 répondant à certains critères, les renvoyant dans un vecteur. Notez que parce que le << obtenir des lignes où () message est envoyé à dt1, il est entendu que: ID et: Timepoint sont également dans dt1.
2) Utilise le vecteur renvoyé à l'étape 1 ci-dessus comme index de dt1: Date d'exécution, qui est la colonne Date d'exécution dans dt1. Étant donné que nous avons explicitement défini la date d'exécution sur la table dt1 à l'aide de dt1: Date d'exécution, peu importe que dt1 soit la table actuelle ou non. L'achèvement de cette 2ème étape renvoie un vecteur de valeurs - exactement celles que nous voulons - à partir de la colonne Date d'exécution.
3) Attribue le vecteur des valeurs de date d'exécution renvoyées à l'étape 2 ci-dessus comme valeur d'une clé spécifique, Les données, dans le tableau associatif, data_array .
Acclamations,
Brady
Re: Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionSalut Jim. Merci pour votre réponse. Pourriez-vous expliquer en anglais humain comment votre code fonctionne? Mon interprétation est la suivante: toutes les lignes où l'ID est unique sont placées dans les lignes. Ensuite, un index k est instancié.Il est incrémenté à l'intérieur de la boucle où les dates d'exécution sont ajoutées au tableau de données.À l'intérieur de cette boucle, maintenant, au lieu de ce que j'avais auparavant, chaque valeur unique dans theRows est utilisée comme un index pour accéder: Date d'exécution et ce résultat est rempli dans le tableau de données.
Cela aurait du sens pour moi si seulement je l'étudiais plus longtemps. Ce n'est pas trop clair à première vue. Pas certain. Mais vous expliquez à la fin de votre message avec une conclusion en une ligne.
Après avoir remplacé toutes les variables nettoyées par mes vraies variables dans mon code, j'obtiens l'erreur:
invalid subscript (must be number or list of numbers) in access or evaluation of 'theRows[k]' , theRows[/*###*/k]
et je ne sais pas pourquoi.
Je suis toujours confus et je vais continuer à étudier ce bout de code. C'est étrange, j'ai suivi pas mal de cours de codage à l'université, mais je n'ai pas maintenu ma base de connaissances, donc je suppose qu'elle aurait pu s'éroder avec le temps.
Merci de votre aide!
Michael
PS: Quant à savoir pourquoi les tableaux associatifs: J'ai pensé que ce serait un moyen efficace de transférer des données en tant que débutant JMP avec une expérience plus proche de Java / Python. Recommanderiez-vous de manipuler directement les tableaux? Je suis si loin sur cette voie, cependant, que je me demande s'il ne serait tout simplement pas intéressant d'accomplir la tâche à accomplir de cette manière.
Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionMerci, Brady. Tout cela a du sens pour moi.
Il semble que certaines de ces choses étaient en fait des problèmes dans mon code. Je les ai abordés et je continue. J'ai de nouveaux problèmes que je posterai une fois que je les aurai un peu compris.
Mike