回复:創建 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 社區,加油!!!
數據混合和清理