创建 JMP 公式以从具有四个分类变量的查找表中提取值大家好,
我正在为 75 种不同的鸟类开发栖息地适宜性指数。 对于每种鸟类,我都有与此处描述的表结构相同的表(并作为 JMP 数据表附加)。 我将按物种堆叠它们,以便所有物种都包含在同一张表中。 附表是分层的。 层次结构的第一级是物种(目前只有一个,但最终所有 75 个物种的数据都将在同一个表中)。 层次结构的下一层是地形(例如,山谷、梯田或山脊)。 一旦确定了地形,层次结构的下一个层次是土地覆盖类型(例如,落叶林、针叶林、混交林)。 一旦确定了地形/土地覆盖组合,下一个级别是木材等级(例如,灌木苗木、树苗、杆锯材、大锯材)。 物种、地形、土地覆盖和木材类别的每个 4 向组合具有介于 0 和 1 之间的栖息地适宜性值。 例如,喜欢老落叶林的食虫莺对山谷/落叶/大锯材组合具有较高的栖息地适宜性值 (0.8)。 对于山脊/混交林/树苗组合,同一物种具有较低的栖息地适宜性值 (0.2)。 如果你看一下附表,这对你来说是有意义的。
我希望能够创建一个公式,我可以将其用作引用此查找表的列属性,以根据任何给定地点的物种/地形/土地覆盖/木材类别组合(我有千)。 我的第一个想法是使用详细的 if then 语句来做到这一点,但是每个物种和 75 个物种有 60 个地形/土地覆盖/森林年龄组合。 除了在公式编辑器中手动之外,我不知道如何做到这一点,这似乎很疯狂。 是否有一种简单、更有效的方法来创建列公式,该列公式可以引用此查找表,以根据四个层次分类数据列的独特组合提取适宜性值:物种/地形/土地覆盖/木材类别?
对于这方面的任何帮助,我将不胜感激。 我看到了一个较旧的帖子@brady_brady关于如何为更简单的查找表创建公式,但我无法弄清楚它如何适用于这样的分层数据集。 去吧,JMP 社区,去吧!!!
数据表回复:创建 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。
为您拥有的两个表创建链接列(例如连接所有四个分组值):


然后执行虚拟连接:
适合作为链接 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 作为列。