Cas spécifique des tables se joignantTout,
J'ai un problème spécifique à résoudre et, bien que je l'aie résolu manuellement avec un sous-ensemble de données d'origine minuscule, je ne pourrai pas le faire pour l'ensemble de données énorme.
Alors, voici le problème. J'ai deux tables.
Premier tableau - quelques mesures effectuées sur un ensemble d'outils
| Outil | Rendez-vous amoureux | La mesure |
A001 | 1/1/2017 | 0,005 |
| B006 | 02/02/2017 | 0,003 |
Deuxième tableau - historique du remplacement de certaines pièces sur les mêmes outils:
| Outil | Rendez-vous amoureux | Partie s / n |
| A001 | 1/1/2016 | 1234567 |
| B006 | 02/02/2016 | 0987654 |
| A001 | 29/12/2016 | 1234568 |
Ce que j'aimerais voir, comment les mesures pour chaque outil dépendent de l'âge de la pièce installée. Ce dont j'ai besoin en tant que table résultante est la même table avec les mesures, mais avec quelques colonnes ajoutées:
| Outil | Rendez-vous amoureux | La mesure | Partie installée | Date d'installation | Âge de la pièce |
A001 | 1/1/2017 | 0,005 | 1234568 | 29/12/2016 | 4 jours |
| B006 | 02/02/2017 | 0,003 | 0987654 | 29/12/2016 | 365 jours |
En gros, je l’ai fait manuellement pour un seul outil: une colonne vient d’être créée et remplie avec la date de remplacement la plus proche. Puis déplacé vers le bas de la table de mesure jusqu'à la date de la prochaine installation - et de là remplit la même colonne jusqu'à la fin avec la nouvelle date d'installation, puis déplacé plus loin .... Fastidieux.
Je dois en quelque sorte automatiser cela, mais je ne peux même pas commencer à penser à cela.
Ainsi, pour chaque ligne du tableau de mesure, je dois trouver une ligne dans le tableau de remplacement des pièces, qui correspond à l'outil et dont la date d'installation est antérieure à la date de la ligne considérée. Ensuite, je devrais prendre ce numéro de série, cette date et le mettre dans le tableau des mesures. Ensuite, il est facile de calculer l'âge de la pièce. Certaines dates d'installation de pièces sont si anciennes qu'elles ne sont pas couvertes par ces deux tableaux. Il se peut donc que j'aie beaucoup de valeurs manquantes.
Quelqu'un pourrait-il m'aider avec la méthodologie et peut-être un peu avec le démarrage du script?
Merci beaucoup!
Re: Cas spécifique de tables se joignantIan,
Êtes-vous sûr que
Loc(replacedOn[rowsForThisTool] == latestReplacementDate);
est la syntaxe correcte?
Je veux dire que je comprends ce que vous vouliez faire ici, mais cela me donne une erreur et la syntaxe aide dit que ce serait Loc (x, y) - vous donne tous les indices dans x où il est égal à y. Égal seulement, pas n'importe quelle déclaration logique. Des idées comment réécrire cette déclaration?
Merci!
Re: Cas spécifique de tables se joignantIan,
Pensez-vous que quelque chose comme ceci fonctionnerait:
currentReplacementDate = Max(replacedOn[rowsForThisTool]<thisDate);
Où thisDate est analogue à thisTool:
thisDate = currentMeasDate[t];
et currentMeasDate est juste une date du tableau de mesure.
Maintenant, puisque ces deux tables sont produites par des systèmes différents, les formats de dates sont différents (y / m / j vs m / j / y hh: mm: ss ou quelque chose du genre). Dois-je en quelque sorte traduire l'un en un autre, ou ce sera fait automatiquement?
Re: Cas spécifique de tables se joignantIan,
Merci beaucoup pour cette réponse détaillée.
Petite question à ce sujet:
latestReplacementDate = Max(replacedOn[rowsForThisTool]);
Le remplacement des pièces est effectué régulièrement au fur et à mesure des mesures. Donc, je dois non seulement trouver la dernière, je dois aussi trouver la pièce qui était sur l'outil lors de cette mesure, la dernière ne suffit pas. Fondamentalement, je dois trouver la dernière date de remplacement telle que la date de mesure soit supérieure à la date de nouvelle entrée. Toute suggestion sur la façon de le faire de la manière la plus efficace et la plus élégante? J'ai des années de données quotidiennes sur des dizaines d'outils avec des remplacements de pièces tous les mois, alors il vaut mieux être efficace - jusqu'à présent, je ne peux que créer une autre boucle comparant les dates une par une.
Si vous avez une solution plus élégante à l'esprit, je l'apprécierais beaucoup.
Re: Cas spécifique de tables se joignantVous pouvez essayer quelque chose comme ça:
NamesDefaultToHere(1);
dt1 = DataTable("Measurements On Tools");
dt2 = DataTable("Parts Replaced");
// Get a list of the tools on which measurements were made
toolsUsed = Column(dt1, "Tool") << getValues;
// Get a list of the tools which had one or more parts replaced
toolsWithReplacedPart = Column(dt2, "Tool") << getValues;
// Get the corresponding replacement dates
replacedOn = Column(dt2, "Date") << getValues;
// And the corresponding part numbers
partSN = Column(dt2, "Part SN") << getValues;
// Make a new vector and a list that will be populated via the loop below
dates = J(NRow(dt1), 1, .);
parts = {};
// Loop over each measurement made
for(t=1, t<=NItems(toolsUsed), t++,
thisTool = toolsUsed[t];
// Find the rows in dt2 in which this tool is referenced
rowsForThisTool = Loc(toolsWithReplacedPart, thisTool);
// Find the latest date on which a part was replaced and store it
latestReplacementDate = Max(replacedOn[rowsForThisTool]);
dates[t] = latestReplacementDate;
// Identify the new part used and store it
rowForLatestPart = Loc(replacedOn[rowsForThisTool] == latestReplacementDate);
newPart = partSN[rowsForThisTool][rowForLatestPart];
InsertInto(parts, newPart);
);
// Add the new columns to dt1
dt1 << newColumn("Last Installed Part", Character, Values(parts));
dt1 << newColumn("Installed Date", Numeric, Continuous, Values(dates), Format( "m/d/y", 12 ));
dt1 << New Column( "Age of Part", Numeric, Continuous, Format( ":day:hr:m", 14 ), Formula( :Date - :Installed Date ));
Le code est détaillé pour essayer de montrer la logique utilisée. Gardez à l’esprit que cela n’a fait l’objet d’aucun test et pourrait être considérablement amélioré: par exemple, les «<< getValues ()» ne sont pas nécessaires (du moins dans JMP 13).
Re: Cas spécifique de tables se joignantC'est exactement ce que j'ai fait. J'avais l'air bien jusqu'à ce que je poste.
Re: Cas spécifique de tables se joignantvous pouvez insérer un tableau en cliquant sur l'icône du tableau
| 11 |
44 |
222 |
| 333 |
444 |
66 |
| 88 |
55 |
99 |
Re: Cas spécifique de tables se joignantÀ propos, désolé pour les tables laides - dans la fenêtre d'édition, elles avaient l'air OK. Impossible de trouver un moyen de revenir au sujet à éditer pour rendre les tableaux plus lisibles. Est-ce même possible?
Merci!