Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesSalut tout le monde,
Je développe des indices de qualité de l'habitat pour 75 espèces d'oiseaux différentes. J'ai des tableaux avec la même structure que celui décrit ici (et joint en tant que tableau de données JMP) pour chaque espèce d'oiseau. Je vais les empiler par espèce afin que toutes les espèces soient incluses dans le même tableau. Le tableau ci-joint est hiérarchique. Le premier niveau de la hiérarchie est celui des espèces (actuellement, il n'y en a qu'une seule, mais les données des 75 espèces finiront par figurer dans le même tableau). Le niveau suivant de la hiérarchie est le relief (par exemple, vallée, terrasse ou crête). Une fois que le relief a été déterminé, le niveau suivant de la hiérarchie est le type de couverture terrestre (p. ex. feuillus, conifères, forêt mixte). Une fois que la combinaison forme de relief/couverture du sol a été déterminée, le niveau suivant est la classe de bois (p. ex., semis d'arbustes, gaules, bois de sciage sur poteau, gros bois de sciage). Chaque combinaison à 4 facteurs d'espèces, de formes de relief, de couverture terrestre et de classe de bois a une valeur d'adéquation de l'habitat comprise entre 0 et 1. Par exemple, la Paruline vermivore, qui aime les vieilles forêts de feuillus, a une valeur d'habitat convenable élevée (0,8) pour la combinaison vallée/feuillus/grands bois de sciage. Cette même espèce a une valeur d'habitat convenable plus faible (0,2) pour la combinaison crête/forêt mixte/gaules. Si vous regardez le tableau ci-joint, cela vous semblera logique.
J'aimerais pouvoir créer une formule que je peux utiliser comme propriété de colonne qui fait référence à cette table de recherche pour trouver des valeurs d'adéquation de l'habitat basées sur la combinaison espèce / relief / couverture terrestre / classe de bois pour un site donné (dont j'ai milliers). Ma première pensée a été de le faire avec une déclaration élaborée si alors, mais il y a 60 combinaisons de forme de relief / couverture du sol / âge de la forêt pour chaque espèce et 75 espèces. Je ne sais pas comment faire cela autrement que manuellement dans l'éditeur de formule et cela semble fou. Existe-t-il un moyen simple et plus efficace de créer une formule de colonne qui peut référencer cette table de recherche pour extraire des valeurs d'adéquation basées sur des combinaisons uniques des quatre colonnes de données catégorielles hiérarchiques : espèces / relief / couverture terrestre / classe de bois ?
Je serais reconnaissant pour toute aide à ce sujet. J'ai vu un ancien post de @brady_brady sur la façon de créer une formule pour une table de recherche beaucoup plus simple, mais je ne pouvais pas comprendre comment cela pourrait fonctionner pour un ensemble de données hiérarchique comme celui-ci. GO, communauté JMP, GO !!!
Tableau de donnéesRe : Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesIl y a quelques problèmes.Je ne sais pas quelle version de JMP vous utilisez.J'ai développé la formule dans JMP 16, qui a apparemment un bogue.Par conséquent, la formule a été modifiée lorsque je l'ai enregistrée dans JMP 16, par rapport à ce avec quoi je l'avais testée.Je signalerai le bogue après avoir fini de vous répondre.La bonne formule à utiliser est :
If( Row() == 1,
dt = Data Table( "WEWA suitability matrix with data" );
dtLookup = Data Table( "WEWA suitability matrix" );
Show( dt, dtlookup );
);
curSpec = Uppercase( dt:Species );
curLandForm = Uppercase( dt:Landform );
curLandCover = Uppercase( dt:Landcover );
curTimber = Uppercase( dt:Timber Class );
x = .;
Try(
x = dtLookup:Suitability[dtLookup << get rows where(
Uppercase( dtLookup:Species ) == curSpec & Uppercase( dtLookup:Landform ) == curLandForm & Uppercase( dtLookup:Landcover ) ==
curLandCover & Uppercase( dtLookup:Timber Class ) == curTimber
)][1],
.
);
x;
J'ai également modifié cette formule dans ma dernière réponse, donc personne ne devrait avoir de problème avec elle.
Dans les dernières données que vous avez fournies, il y a une incompatibilité avec la table de données de recherche.Vous avez remplacé certaines lettres minuscules par des majuscules.La formule originale que j'ai écrite ne compense pas cela.Dans la version actuelle, j'ai forcé toutes les recherches à être effectuées en majuscules afin que cela ne soit plus un problème.
Re : Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesHé @txnelson
Vos deux solutions me conviennent. Je préférerais la solution basée sur la formule. Je suis allé de l'avant et j'ai copié la formule de votre colonne "formule dérivée." dans le tableau des espèces observées que vous avez créé dans un deuxième tableau JMP où je calcule en fait les indices d'adéquation de l'habitat (ci-joint). Lorsque j'essaie d'appliquer la formule, j'obtiens l'erreur suivante :

Je ne sais pas comment résoudre ce problème. Pourriez-vous jeter un coup d'œil à la "colonne d'adéquation dérivée de la formule) dans le tableau de données JMP ci-joint et me faire savoir où j'ai pu faire une erreur ? Merci encore pour votre aide. Casey
Re : Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesVous pouvez peut-être aussi essayer d'utiliser Virtual Join.
Créez une colonne de liaison (par exemple, concaténez les quatre valeurs de regroupement) aux deux tables que vous avez :


Et puis effectuez une jointure virtuelle :
Tableau avec aptitude comme ID de lien :

Table vers laquelle vous voulez tirer des éléments :

Si je me souviens bien, les jointures virtuelles exigeaient que vous ayez au moins la table de données qui sera enregistrée avec l'ID de lien.
Éléments essentiels pour comprendre la jointure virtuelle dans JMP
Jointures virtuelles JMP On Air
Re : Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesEDIT: OOPS, j'ai raté la partie sur le fait que vous vouliez ceci dans une table en tant que propriété de colonne - je pensais que vous vouliez simplement renvoyer une valeur basée sur quelqu'un sélectionnant les 4 valeurs dans une boîte de dialogue ou quelque chose du genre. Par conséquent, vous devriez aller avec quelque chose comme Jim propose.
Acclamations,
brady
//////////////////
Salut,
Il existe de nombreuses façons de le faire... probablement la méthode la plus "classique" implique un tableau associatif avec des clés multidimensionnelles, mais pour votre cas d'utilisation, il est beaucoup plus simple de faire quelque chose comme ce qui suit :
Names Default To Here( 1 );
//suppose these are the values you want to look up, and you've gotten them somehow
spec = "Worm-eating warbler";
form = "Terrace-mesic";
cover = "Mixed";
class = "sapling";
//set a variable reference to the lookup table
dt1 = Data Table( "WEWA suitability matrix.jmp" );
//add a formula column to the lookup table, concatenating these 4 values, separated by a comma for clarity
dt1 << New Column( "Concat", character, formula( Concat Items( {:species, :landform, :landcover, :timber class}, "," ) ) );
//create a matrix of the suitabilities and a list of the combo values
suits = dt1:suitability << get values;
combos = dt1:concat << get values;
//create a lookup value from your 4 values by concatenating them in the same way you did in the formula
myLookup = concatitems({spec, form, cover, class}, ",");
//grab the suitability value you want; it will have the same position in its matrix as the lookup value has in its list
s = suits[contains(combos, myLookup)];
show (s);
Acclamations,
brady
Re : Création d'une formule JMP pour extraire des valeurs d'une table de recherche avec quatre variables catégoriellesVoici deux façons de gérer votre recherche.La première est une formule que j'ai créée et appliquée à un exemple de table avec seulement 3 entrées.Il recherche dans le tableau de données de la matrice d'adéquation WEWA et extrait la valeur d'adéquation.C'est une belle formule, mais pas très efficace.

Voici la formule utilisée pour la colonne "Formule dérivée de l'aptitude"
If( Row() == 1,
dt = Data Table( "WEWA suitability matrix with data" );
dtLookup = Data Table( "WEWA suitability matrix" );
Show( dt, dtlookup );
);
curSpec = Uppercase( dt:Species );
curLandForm = Uppercase( dt:Landform );
curLandCover = Uppercase( dt:Landcover );
curTimber = Uppercase( dt:Timber Class );
x = .;
Try(
x = dtLookup:Suitability[dtLookup << get rows where(
Uppercase( dtLookup:Species ) == curSpec & Uppercase( dtLookup:Landform ) == curLandForm & Uppercase( dtLookup:Landcover ) ==
curLandCover & Uppercase( dtLookup:Timber Class ) == curTimber
)][1],
.
);
x;
La deuxième méthode, qui crée la colonne appelée "adéquation", est créée à l'aide de la plate-forme de mise à jour dans JMP.Voici le script pour sa création
names default to here(1);
Data Table( "Observed Species" ) << Update(
With( Data Table( "WEWA suitability matrix" ) ),
Match Columns(
:Species = :Species, :Landform = :Landform, :Landcover = :Landcover,
:Timber Class = :Timber Class
)
);
PSLe tableau de données appelé Espèces observées commence avec uniquement les colonnes Sepcies, Landform, Landcover et Timber Class.