統計列中符合某些條件的唯一項目的數量假設在“大班”中,我想要一個公式來統計當前行中身高等於或小於當前行學生身高的不同姓名的數量。我該如何實現呢?
我有這個:
thisHeight = :height;
Col N Unique( :name, :height <= thisHeight );
我知道第二個參數是分組參數,更直觀的做法是嘗試限制傳遞給第一個參數的內容,但我到目前為止嘗試的所有方法都沒有成功。
資料存取回覆:統計列中符合某些條件的唯一項目的數量我能想到的最接近的內建函數是Col Rank( :height, < 問題是:這計算的是高度等於或低於此高度的行總數,而不是唯一名稱的數量。
或者,您可以嘗試使用自訂公式,例如:
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
回覆:統計列中符合某些條件的唯一項目的數量我不確定是否可以使用 Col 函數來實現,因為新版本和舊版本的行為略有不同。
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
回覆:統計列中符合某些條件的唯一項目的數量我昨晚嘗試了一個非常類似的方法,結果 JMP 卡死了。我讓它運行了一整夜,今天早上起來發現 JMP 資料表視窗一片空白,沒有回應。工作管理員顯示機器只使用了一個核心,還有 40 多 GB 的可用記憶體(所以它並沒有耗盡記憶體或佔用過多 CPU)。我的表有近 40 萬行數據,所以我認為這可能是 O(N^2) 類型的解決方案…
回覆:統計列中符合某些條件的唯一項目的數量@jthi關於我上面的評論,這看起來也是一個 O(N^2) 的解法。 (一個錯誤的公式就能阻塞/崩潰整個會話,真是太糟糕了,昨天我因為嘗試類似的解法而丟失了下午的大部分工作。)
很遺憾新的列函數不能正常工作,我的問題可能過於簡單了,我還需要分組列,但我不知道如何在這個方案中實現它們。我可能只能用 Python 來實現,這很麻煩,因為列不會自動更新,而且 Python 腳本目前還不能儲存到表中。
附:我希望每次交流都能從你身上學到一些東西
—— 為什麼這種方法需要「As Constant()」函數?如果沒有它會怎樣?
回覆:統計列中符合某些條件的唯一項目的數量如果你需要公式,我不確定 Python 是否能很好地勝任。因為 Constant() 函數是為了避免在每一行都重複取得名稱清單。
回覆:統計列中符合某些條件的唯一項目的數量考慮到各種因素,Python 解決方案奏效了,而且實現/運行速度也相當快。
仍然希望 Col N Unique() 能在未來的版本中進行改進,使其與其他函數類似。
我也希望哪裡能找到一本“JMP 公式大全”,方便我們查閱。我成年後 33 年裡一直在寫 VBA、AppleScript、Perl、Python 和 JavaScript(以及少量 C++),JSL 是迄今為止最難學、最難理解的語言。我至今仍然不明白為什麼需要 `As Constant()` 函數,也不知道它到底有什麼作用。我讀過大部分的腳本指南,但感覺還是需要再出一本。
回覆:統計列中符合某些條件的唯一項目的數量您不希望計算公式執行過程中每一行都不會改變的值。 As Constant() 函數的作用就在於此,它使 JMP 只在第一行計算一次該表達式。
作為常數(expr)

我認為你基本上可以用(很可能不完全相同,但非常接近)來代替它。
If(Row() == 1,
n = :name << get values;
);
回覆:統計列中符合某些條件的唯一項目的數量恐怕這個問題會陷入無止盡的討論,但我還是想問最後一個問題——
列公式是否實際上只計算一次,但每次計算時每個表達式都在數組上下文中執行?
或者,整個公式是否會為每一行重新執行一次,而 Row() 函數則指定目前正在評估哪一行?
或者,我誤解了某些更根本的東西?我對JMP處理公式的理解似乎被分割成了互不相容的部分…
回覆:統計列中符合某些條件的唯一項目的數量了解 JMP 內部機制的人或許能給出比我更好的答案(例如@Craige_Hales )。我把它們看作表達式(其實就是 JSL 程式碼),會在需要時直接對資料表的每一行進行求值。求值時機由 JMP 決定,除非我禁止求值。 JMP 也做了一些最佳化,例如 Col 函數,它們(大多數情況下)只會求值一次。
JMP幫助中心有一些有用的鏈接,但我只能快速找到這一個:
回覆:統計列中符合某些條件的唯一項目的數量以下是一種探索兔子洞的方法:
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

分號 (;) 是 JSL 運算符,用於執行一系列語句並傳回最後一個語句的值。這表示可以在計算語句前新增列印/顯示/寫入語句,以便在日誌中產生追蹤資訊。
上面我了解到,asconstant(...) 是在計算第一行之前提取出來的,但當前行是第 1 行。
JMP 也會對欄位進行排序,以決定哪些欄位可以先進行評估。
回覆:統計列中符合某些條件的唯一項目的數量E列這樣寫會比較合理:
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
Q 變數是不必要的,它掩蓋了 AsColumn 存在的意義。
回覆:統計列中符合某些條件的唯一項目的數量這裡還有一個鏈接,有時可能會有幫助(不要把所有內容都塞進一個公式裡): 使用 JMP > 在 JMP 中創建公式 > 在 JMP 中創建公式

另一個好處是,如果您有多個公式,則更容易驗證結果,在某些情況下還可以偵錯公式。