Comment joindre des tables en fonction d'une colonne entièrement correspondante et d'une correspondance la plus proche ?Salut,
Je souhaite joindre deux tables de données via la fonction "Join" de JMP. Je voudrais les rejoindre en fonction de l'heure et du numéro de réacteur. Cependant, cela ne fonctionne pas car la colonne 'time' a 8 décimales dans l'un des fichiers de données et l'autre zéro décimale.
(Comment) serait-il possible de faire correspondre exactement le temps sur le point de correspondance le plus proche et le numéro de réacteur ?
J'ai déjà trouvé des discussions plus anciennes sur ce problème. Cependant, ces solutions n'ont pas fonctionné pour moi car une deuxième colonne "numéro de réacteur" ne pouvait pas être mise en correspondance.

Voici une capture d'écran des deux tables de données que je voudrais combiner. La sortie doit contenir à la fois le temps, le réacteur, la réflectance et le poids sec.
Merci d'avance!
Fusion et nettoyage des donnéesRe : Comment joindre des tables en fonction d'une colonne entièrement correspondante et d'une correspondance la plus proche ?L'exemple de jeu de données que vous avez fourni comporte-t-il des valeurs erronées ?
Créez la colonne poids sec g/l et renommez Temps h en temps h dans les données de réflectance :

Concaténer les données de poids sec à cela :

Sélectionnez le réacteur et la colonne Time h et triez-les.
Sélectionnez la valeur manquante dans le poids sec -> sélectionnez les cellules correspondantes -> inversez la sélection
Vous pouvez maintenant parcourir le tableau pour trouver les valeurs les plus proches :

À ce stade, vous pouvez créer des formules ou des scripts d'aide pour calculer la valeur la plus proche, par exemple quelque chose comme ceci pour réduire davantage les données :
Names Default To Here(1);
dt = Current Data Table();
r = dt << Get Selected Rows; //selecting of wanted rows could be done in script instead of datatable
r_min = r - 1;
r_max = r + 1;
dt << Subset(rows(Sort List(r||r_min||r_max)), Selected Columns(0));

À ce stade, vous pouvez très probablement copier-coller les valeurs de temps de poids sec dans une nouvelle colonne et créer une formule pour calculer la ligne la plus proche.

Voici ce que la jointure des lignes les plus proches renverrait lorsque Join est utilisé :

Avec Update, il ne créera pas autant de colonnes désordonnées :

L'interface utilisateur des outils semble avoir un problème lors de la sélection des tables... et l'utilisateur doit s'assurer que les tables correctes ou sélectionnées ou l'outil fera l'auto-jointure.
Re : Comment joindre des tables en fonction d'une colonne entièrement correspondante et d'une correspondance la plus proche ?Merci pour votre réponse! Je vais télécharger un petit exemple oui.
J'ai déjà essayé de le faire manuellement, mais cela a pris tant de temps qu'il y a jusqu'à 24 groupes/réacteurs et vous devrez faire défiler de nombreux points de temps. Créer des sous-ensembles ? Comment verriez-vous cela fonctionner?
Re : Comment joindre des tables en fonction d'une colonne entièrement correspondante et d'une correspondance la plus proche ?Pourquoi ne pas simplement créer une nouvelle colonne qui arrondit () l'heure de celle à 8 chiffres et se joindre à cela?
**Modifier** Peu importe.Je vois immédiatement pourquoi.
Vous pouvez obtenir un sous-ensemble de l'heure la plus proche uniquement en procédant comme suit
Names default to here(1);
dt = New Table( "Example",
New Column( "Time",
Set Values( [14.14, 14.28, 13.56, 13.11, 12.32, .] )
)
);
dt << New Column("Rounded Time",
Formula(Round(:Time, 0))
);
// we're just going to for the row that the value for time - rounded time = the min for that value
dt << New Column("Closest",
Formula(
Abs(:Time - :RoundedTime) == ColMin(Abs(:Time - :RoundedTime), :RoundedTime)
)
);
Re : Comment joindre des tables en fonction d'une colonne entièrement correspondante et d'une correspondance la plus proche ?Pourriez-vous fournir de petits exemples de jeux de données qui ont plusieurs réacteurs sur les deux tables de données (et dans le meilleur des cas également une table avec des résultats corrects) ? Cela pourrait être possible de le faire à la main s'il n'y a pas trop de groupes et qu'il n'y a pas besoin d'automatisation. Vous pouvez peut-être utiliser le complément fuzzy_merge et utiliser de nombreux sous-ensembles pour gérer les groupes de bioréacteurs.
J'ai aussi un script (et un outil) qui devrait pouvoir le faire, mais Je n'ai pas encore eu le temps de le tester complètement , et je sais avec certitude qu'il a encore quelques légers bugs. L'outil Joindre les lignes les plus proches devrait pouvoir :
- Rejoindre en fonction de la distance
- Joignez les tables en arrière, en avant et au plus proche (avec des options de bris d'égalité en option)
- Autoriser le regroupement
- Autoriser l'utilisation de la tolérance
- Ne devrait pas nécessiter d'avoir des tables de données triées
