Déplacer un sous-ensemble de données d'une table vers les colonnes d'une seconde table avec une transpositionJe suis désolé de poster à nouveau ceci. J'ai posté des morceaux de mon flux de travail, masqués, ici, pour obtenir de l'aide, et je suis toujours en difficulté. 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 ainsi de suite sans raison réelle. Je suis sûr que les cicatrices guériront avec le temps. Quoi qu'il en soit, je suis là et je finirai par répondre à vos réponses.
Pour en venir 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 distinctes en supposant que tout s'est bien passé pendant la partie laboratoire du projet, à laquelle je n'étais pas présent) dans trois colonnes distinctes d'un fichier manifeste qui garde une trace des métadonnées en cours pour notre projet, d'après ce que j'ai glané, de sorte que chaque colonne soit une instance de collecte de données. Il existe 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 » (cela dépend de la façon dont vous le regardez), même si je pense que cela devrait être tout.
Voici mon pseudo-code sur lequel j'ai essayé de travailler et cela a été difficile jusqu'à présent. Je ne sais pas pourquoi. Je ne suis pas un informaticien, un développeur ou un ingénieur logiciel chevronné. 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 identifier
Fusion et nettoyage des donnéesRe : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionMaintenant, j'essaie d'attribuer les données/dates au fichier manifeste dans les lignes avec les ID corrects :
... );
//write(LBCM_array);
dt_manifest << Get Rows Where(dt_manifest:ID Number for Updating Table == ID)[:Actual Data 1 Date] = data_array["data1"];
//repeat for data 2 & 3
);
ce qui, vraiment, je n'ai toujours aucune idée de comment faire à partir de JSL en tant que débutant, donc j'obtiens l'erreur
["data1" => {}, "data2" => {}, "data3" => {}]
attempting to assign to an object that is not an L-value in access or evaluation of 'Assign' , dt_manifest << Get Rows Where(
dt_manifest:ID Number for Updating Table == ID
)[:Actual Data 1 Date] = /*###*/data_array["data1"] /*###*/Je n'ai aucune idée de ce que cela signifie.
Merci,
Mike
Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionCe qui suit fonctionne pour moi...
Names Default To Here( 1 );
dt_data = Open("...");
Summarize( dt_data, IDs = by(dt_data:ID)); //this finds all the unique donor IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest data file.
For(i = 1, i <= N Items(IDs), i++,
ID = num(IDs[i]); //the type conversion here is important, or else a key-value call in the associative array below doesn't work
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
data_array[data] = dt_data:Run date[dt_data << Get rows Where(:ID == ID & :Timepoint == data)]
);
);sauf que maintenant j'ai plusieurs copies de chaque entrée de données (date et heure) dans le data_array. Je me demande comment nettoyer ce nettoyage, faire une seule copie de chaque date/donnée dans data_array ?
J'ai essayé une instruction if, en utilisant une instruction As Date() pour comparer et formater les dates de comparaison et d'entrée afin de nous assurer que nous n'obtenons qu'une seule valeur unique. Mais cela m'a posé des problèmes jusqu'à présent (c'est-à-dire que le tableau se transforme en erreur ou se vide à nouveau).
Cependant, je suis vraiment satisfait des progrès accomplis jusqu'à présent.
@txnelson : Désolé, j'aime bien votre méthode et merci pour votre aide, mais vous remarquerez que j'ai pu la fandangle sans votre technique d'indexation "k"
. (Je me demande comment votre méthode est équitable lorsqu'il y a plusieurs dates de la même valeur, c'est ce que j'ai dans mon cas ?)
@brady_brady : Remarquez que j'ai implémenté des identifiants de table de données avant les appels de colonne, le cas échéant. Merci de m'avoir enseigné ce concept de base; J'étais mort de curiosité à ce sujet et j'ai googlé sans fin sans résultat jusqu'à présent.
Mike
Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionSalut tout le monde. Je progresse, en fait, pour une fois, au lieu de rester bloqué sur quelque chose sans savoir dans quelle direction aller.
Pour le moment, l'une de mes paires clé/valeur ne correspond pas, j'obtiens donc des résultats incorrects d'un de mes appels de tableau. J'essaie de déboguer ceci afin de pouvoir sous-ensemble/filtrer correctement la table de données jusqu'à ce que je veux pour le transfert vers le tableau associatif.
Merci beaucoup pour votre aide.
MikeRe : 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
Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionSalut Jim. Merci pour votre réponse. Cela vous dérangerait-il d'expliquer en anglais humain comment fonctionne votre code ? Mon interprétation est la suivante : toutes les lignes où l'ID est unique sont placées dans theRows. 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 index pour accéder à :Run date 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 variables réelles 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 a pu s'éroder avec le temps.
Merci de votre aide!
Michael
PS : 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 tables ? Je suis si loin sur cette voie, cependant, que je me demande s'il serait tout simplement 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 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 d'examiner ceux-ci :
1) : La date d'exécution, telle qu'elle est écrite, fait référence à une colonne de la table de données en cours 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 actuelle, si vous laissez à JMP le choix de la table à utiliser. Vous pouvez forcer n'importe quelle table de votre choix à ê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
Cependant, vous n'avez pas besoin de laisser JMP décider. Vous pouvez spécifier explicitement la table à utiliser, actuelle ou non, à l'aide d'un tableau: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 les 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îtrait alors comme :
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
Cette ligne remplit 3 missions :
1) Obtient les lignes de dt1 répondant à certains critères, en 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:Run Date, qui est la colonne Run Date dans dt1. Étant donné que nous avons explicitement étendu la date d'exécution à la table dt1 à l'aide de dt1:Run Date, peu importe que dt1 soit ou non la table actuelle. L'achèvement de cette 2e étape renvoie un vecteur de valeurs - exactement celles que nous voulons - à partir de la colonne Date d'exécution.
3) Affecte 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 .
À votre santé,
brady
Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième table avec une transpositionMike,
Je reste un peu perdu sur la raison pour laquelle vous voulez utiliser un tableau associatif, mais quoi qu'il en soit, 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 disposition de vos données.Je ne fais que deviner en fonction de vos déclarations et de l'utilisation du code.

Voici le scénario.La table de données ci-dessus est générée au début du script, donc le courage de votre code, avec mes modifications, vient 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 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 deuxième table avec une transpositionSalut tout le monde. Voici mon code jusqu'à présent:
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 pour espionner les informations de l'entreprise
) tout en conservant la structure et les informations (nom 'a' nom, étiquette à étiquette).
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 fois/trois fois et c'est pourquoi data_array a trois clés et trois valeurs vides lors de son initialisation. 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 fonctionnera.
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 des lignes et des colonnes qui m'intéressent. L'énoncé du problème est-il suffisamment clair à ce stade pour que quiconque dans le public intervienne et offre une solution ou une contribution sur la façon de spécifier d'une manière plus syntaxiquement (et éventuellement 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. Je traiterai de 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 toujours à manipuler les sélections de lignes/colonnes, les sous-ensembles de tableaux de données, etc. problèmes liés.
Une remarque supplémentaire : 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 dirais que je suis encore une recrue dans tout ce processus, et je préfère pécher par excès de sécurité.
Je vais continuer à 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 deuxième table avec une transpositionMerci Brady.Re : Déplacer un sous-ensemble de données d'une table vers les colonnes d'une deuxième 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é d'utilisateurs JMP soit un lieu accueillant et utile, il existe certaines "meilleures pratiques" qui devraient maximiser vos chances d'obtenir les informations que vous recherchez.
Poser des questions spécifiques, plutôt générales, est la voie à suivre si vous pouvez y parvenir - même si je me rends compte que parfois on "ne sait pas ce qu'il ne sait pas". La publication d'une quantité considérable de pseudocode peut effrayer les gens ... si vous ne pouvez pas poser votre question autrement, cela aidera grandement à joindre un fichier "avant" et "après" - et des captures d'écran - afin que les téléspectateurs aient des informations concrètes exemples d'un tableau "début" (ou données textuelles) et d'un tableau "fin". Cela ferait certainement une réelle différence dans ce cas particulier. Si vous devez "désinfecter" les ensembles de données, c'est très bien (le mieux, vraiment). Tant que le point que vous essayez d'illustrer peut encore être avancé, tout va bien.
Si vous posez des questions spécifiques et bien ciblées et que vous incluez des fichiers illustratifs et des captures d'écran, il y a de fortes chances que beaucoup ici interviennent pour vous aider. Je peux penser à plus d'un peu désinvolte qui ne peut pas vraiment résister à ça !
À votre santé,
brady