回复:创建 JMP 公式以从具有四个分类变量的查找表中提取值有几个问题。我不知道您运行的是哪个版本的 JMP。我在 JMP 16 中开发了公式,它显然有一个错误。因此,当我将它保存在 JMP 16 中时,根据我测试过的公式,公式发生了变化。我会在回复完您后报告错误。正确使用的公式是:
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;
我还在上次回复中编辑了这个公式,所以没有人会对此有异议。
在您提供的最新数据中,与查找数据表不匹配。您已将一些小写字母更改为大写字母。我写的原始公式不能弥补这一点。在当前版本中,我强制所有查找都使用大写字母完成,这样就不再是问题了。
回复:创建 JMP 公式以从具有四个分类变量的查找表中提取值嘿@txnelson
你的两个解决方案对我来说都很有意义。 我更喜欢公式驱动的解决方案。 我继续将公式从您创建的观察物种表中的“公式派生..”列复制到第二个 JMP 表中,我实际上在其中计算栖息地适宜性指数(附后)。 当我尝试应用公式时,出现以下错误:

我不确定如何解决这个问题。 您介意看看随附的 JMP 数据表中的“公式导出的适用性列”,让我知道我可能在哪里犯了错误吗? 再次感谢你的帮助。 凯西
回复:创建 JMP 公式以从具有四个分类变量的查找表中提取值您也可以尝试使用 Virtual Join。
创建链接列(例如连接所有四个分组值)到您拥有的两个表:


然后执行虚拟连接:
适合作为 Link ID 的表:

您要将内容拉到的表:

如果我没记错的话,虚拟连接确实要求您至少拥有将保存链接 ID 的数据表。
了解 JMP 中的虚拟连接的要点
JMP On Air 虚拟加入
回复:创建 JMP 公式以从具有四个分类变量的查找表中提取值编辑:哎呀,我错过了关于您希望在表中将其作为列属性的部分——我以为您只是想根据某人在对话框中选择 4 个值或其他内容返回一个值。 因此,您应该采用 Jim 提议的方法。
干杯,
布雷迪
//////////////////
你好,
有很多方法可以做到这一点......可能是最“教科书”的方式涉及具有多维键的关联数组,但对于您的用例,执行以下操作更为直接:
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);
干杯,
布雷迪
回复:创建 JMP 公式以从具有四个分类变量的查找表中提取值这里有两种处理查找的方法。第一个是我创建并应用于仅包含 3 个条目的示例表的公式。它在 WEWA 适宜性矩阵数据表中查找并提取适宜性值。这是一个很好的公式,但不是很有效。

这是用于“Formula durived Suitability”列的公式
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;
第二种创建名为“适宜性”的列的方法是使用 JMP 中的更新平台创建的。这是它的创建脚本
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
)
);
聚苯乙烯名为 Observed Species 的数据表开始时只有 Sepcies、Landform、Landcover 和 Timber Class 作为列。
创建 JMP 公式以从具有四个分类变量的查找表中提取值大家好,
我正在为 75 种不同的鸟类制定栖息地适宜性指数。 对于每种鸟类,我都有与此处描述的结构相同的表格(并作为 JMP 数据表附加)。 我将按物种将它们堆叠起来,以便所有物种都包含在同一个表中。 附表是分层的。 层次结构的第一级是物种(目前只有一个,但最终所有 75 个物种的数据都将位于同一个表中)。 该层次结构的下一个级别是地形(例如山谷、梯田或山脊)。 一旦确定了地形,层次结构的下一个级别就是土地覆盖类型(例如,落叶林、针叶林、混交林)。 一旦确定了地形/土地覆盖组合,下一个级别就是木材类别(例如,灌木幼苗、树苗、杆锯材、大锯材)。 物种、地貌、土地覆盖和木材类别的每个 4 向组合都有一个介于 0 和 1 之间的栖息地适宜性值。 例如,食虫莺,喜欢古老的落叶林,对于山谷/落叶/大锯材组合具有较高的栖息地适宜性值(0.8)。 该同一物种对于山脊/混交林/树苗组合的栖息地适宜性值较低(0.2)。 如果您查看所附表格,您就会明白这一点。
我希望能够创建一个公式,我可以将其用作引用此查找表的列属性,以根据任何给定地点的物种/地形/土地覆盖/木材类别组合查找栖息地适宜性值(其中我有数千)。 我的第一个想法是用一个详细的 if then 语句来做到这一点,但每个物种有 60 个地形/土地覆盖/森林年龄组合,有 75 个物种。 除了在公式编辑器中手动之外,我不知道如何以任何方式执行此操作,这看起来很疯狂。 是否有一种简单、更有效的方法来创建一个列公式,该公式可以引用此查找表来根据四个分层分类数据列(物种/地形/土地覆盖/木材类别)的独特组合来提取适宜性值?
如果有任何帮助,我将不胜感激。 我看到了一篇较旧的帖子@brady_brady关于如何为更简单的查找表创建公式,但我无法弄清楚它如何适用于这样的分层数据集。 加油,JMP 社区,加油!!!
数据混合和清理