創建 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 作為列。