如何在“where”條件下使用 Col 最大值公式嗨,我有一個問題,我想制定一個新專欄作為所有其他國家/地區的基準。 如果國家有更多的行,我想以它的最大值為基準。 請參閱下面的示例以進行說明。
數據看起來像這樣:
國家價值期
一個 10 201301
一個 30 201301
B 20 201301
C 50 201301
D 40 201301
我想要實現的目標(使用單元格公式):Col Maximum (:value, :period, :country)其中:國家==“A”
輸出:
國家價值期基準
10 201301 30
一個 30 201301 30
B 20 201301 30
C 50 201301 30
D 40 201301 30
如您所見,我只想對國家 A 的最大值進行基準測試。
我嘗試了 Col Maximum (:value, :period, :country == "A") 並且它會返回 "50"
Col Maximum (:value, :period, :country) 和 Col Maximum (:value, :period, :country == "A") 都返回 "50"
我很確定有一個簡單的解決方案!
希望你們能幫忙!
謝謝,謝謝!
回复:如何在“where”條件下使用 Col 最大值公式謝謝。回复:如何在“where”條件下使用 Col 最大值公式Col Maximum() 僅在公式中可行,其中每行的分離結果是輸出。要執行您想要的操作,請使用 Summarize() 函數。
看:
幫助==>腳本索引==>總結
回复:如何在“where”條件下使用 Col 最大值公式嗨,馬克,
試圖按年齡或性別獲得最大體重,但在以下腳本中只產生一個值。
按年齡,有 6 個不同的年齡,對於每個年齡,我想計算每個年齡的最大重量。
Names Default To Here( 1 );
Clear Log();
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
max_weight_by_age = Col Max( :weight, :age );
max_weight_by_sex = Col Max( :weight, :sex );
回复:如何在“where”條件下使用 Col 最大值公式我可以將此公式添加到 Big Class 示例數據表中的新列:
Col Max( :weight, :age )
回复:如何在“where”條件下使用 Col 最大值公式嗨,馬克,
你能舉例說明在使用 col Max 時如何使用 嗎?
謝謝。回复:如何在“where”條件下使用 Col 最大值公式請參閱幫助 > 腳本索引 > 函數:

回复:如何在“where”條件下使用 Col 最大值公式謝謝吉姆,我的意思只是總結。 我是怎麼做的(兩個 jsl 命令):
對列進行總結,創建具有值的新表(列的最小值/最大值/或任何其他統計信息)。
然後我通過匹配行條目使用匯總表更新主表。
我只是好奇 Max col() 命令中是否有條件選項可以識別唯一的列值並消除這個額外步驟的需要。 (將消除額外的表格和 2 個額外的步驟)。
感謝你的幫助。
回复:如何在“where”條件下使用 Col 最大值公式我通常使用 Summarize() 函數而不是 Summary Platform 來輕鬆確定在列中找到的級別。然後,從那裡,您只需生成完成工作所需的公式。
回复:如何在“where”條件下使用 Col 最大值公式假設國家列有多個名稱,而我不知道所有可能的值。 如何調整此查詢來做到這一點。
我可以通過創建一個匯總表然後更新該表來做到這一點,但這似乎是一種低效的方法,我很好奇是否可以像這樣一步完成。
提前致謝。
回复:如何在“where”條件下使用 Col 最大值公式這麼晚才回复很抱歉! 感謝您的解決方案!回复:如何在“where”條件下使用 Col 最大值公式鑑於您陳述需求的方式,假設您知道具有多個條目的國家/地區。
dt = Current Data Table();
rowperiod = :Period[Row()];
Max(
:Value[dt << get rows where(
:Country == "A" & :period == rowperiod
)]
);
回复:如何在“where”條件下使用 Col 最大值公式
@hogi寫道:有沒有一行命令從均值計算中刪除女性,但將值寫入帶有“女性”的相應行?
我的意思是,類似於:
Col Mean( :weight, :age, where( :sex == "M" ) )
?
回复:如何在“where”條件下使用 Col 最大值公式將 If() 應用於等式中的 :weight 列

col Mean( if(:sex=="M", :weight,.), :age)
回复:如何在“where”條件下使用 Col 最大值公式極好的!
所以邏輯 - 當你看到它!
我對自己沒有找到這個解決方案感到非常失望。
回覆:如何將 Col 最大公式與「where」條件一起使用嗯,經過一番熱情之後,我有點腳踏實地了。
似乎 Col 聚合內的if使其非常慢 - 特別是如果 if 內有字元比較 - 尤其是 x 2 如果有 char(num) 轉換。然後,時間尺度隨著表格大小的增加而呈現二次方變化。
好處是: Col Median (我大部分時間都使用它)不受這個「bug」的影響:)
對於 Col Min、max、mean ... 是否有任何簡單的解決方案?
如果沒有,我會寫一個願望,實作一個官方方法來計算帶有where條件的Col xyz ...
如果先減少資料集( where ),然後聚合( Col xyz ),然後將值分佈在所有對應的行上,則速度會快得多。

看更多...Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
trialRun = 0;
tryAgain = Function( {},
trialRun += 1;
Rownumbers = N Rows( mydt );
t1 = HP Time();
mydt << New Column( "col A", Formula( Col Mean( :weight ), :sex ) );
t2 = HP Time();
mydt << New Column( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) );
t3 = HP Time();
mydt << New Column( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t4 = HP Time();
mydt << New Column( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) );
t5 = HP Time();
mydt << New Column( "col E", Formula( Char( :age ) == "12" ) );
t6 = HP Time();
tt1 = Round( (t2 - t1) / 1000000, 4 );
tt2 = Round( (t3 - t2) / 1000000, 4 );
tt3 = Round( (t4 - t3) / 1000000, 4 );
tt4 = Round( (t5 - t4) / 1000000, 4 );
tt5 = Round( (t6 - t5) / 1000000, 6 );
If( trialRun == 1,
tt1Ref = tt1;
tt2Ref = tt2;
tt3Ref = tt3;
tt4Ref = tt4;
tt5Ref = tt5;
RNref = Rownumbers;
);
tr1 = Round( tt1 / tt1Ref );
tr2 = Round( tt2 / tt2Ref );
tr3 = Round( tt3 / tt3Ref );
tr4 = Round( tt4 / tt4Ref );
tr5 = Round( tt5 / tt5Ref );
RNratio = Round( RowNumbers / RNref );
Wait( 0.1 );
Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) );
Wait( 0.1 );
mydt = mydt << Concatenate( mydt, mydt, mydt );
Wait( 0.1 );
If(
ex = New Window( "results",
<<TYPE></TYPE></CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">名稱預設為此處( 1 ); If( Is Empty( mydt ), mydt = Open( "$SAMPLE_DATA/Big Class.jmp" ) );試驗運行 = 0; tryAgain = Function( {}, TrialRun += 1; Rownumbers = N Rows( mydt ); t1 = HP Time(); mydt << 新列( "col A", Formula( Col Mean( :weight ), :sex ) ); t2 = HP 時間(); mydt << 新列( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) ); ); mydt <<新列( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) ); New Column( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) ); t5 = HP Time(); ( "col E", Formula( Char( :age ) == "12" ) ) ; t6 = HP Time(); tt1 = Round( (t2 - t1) / 1000000, 4 ); t2) / 1000000, 4 ); tt3 = 回合( (t4 - t3) / 1000000, 4 ); tt4 = 回合( (t5 - t4) / 1000000, 4 ); tt5 = 回合( (t6 - t5) / 1000000, 6 ); If( TrialRun == 1, tt1Ref = tt1; tt2Ref = tt2; tt3ef = tt2; = tt5; RNref = 行號; ); tr1 = Round( tt1 / tt1Ref ); / tt2Ref ); tr3 = 圓形( tt3 / tt3Ref ); tr5 = 圓形( tt5 / tt5Ref ); RNratio = Round( 行號 / RNref );等待(0.1); Try( mydt << 刪除欄位( "col A", "col B", "col C", "col D", "col E" ) );等待(0.1); mydt = mydt << 連接( mydt, mydt, mydt );等待(0.1); If( ex = 新視窗( "結果", < <TYPE></TYPE></DIV></DIV>
In a previous version I had "ms" in the table instead of seconds. Unfortunately, it's 1000x more severe ...
回复:如何將 Col 最大公式與“where”條件一起使用有趣的問題 - 還在等待答案嗎?
有一組帖子有類似的問題如何限制列...聚合功能到特定的子集。
(主要是:將它們限制為非排除行的子集)
計算列平均值,同時限制使用的觀測值
JMP10:Col Max() 和 Col Min() 函數返回排除行中的數據
列函數和行狀態
想法:
如果對平均身高感興趣,可以匯總所有行,或者可以分別匯總男性和女性條目。
對於第二個解決方案,解決方案幾乎與第一個解決方案一樣簡單:只需使用額外的 GroupBy 變量來分割所需數據和不需要的數據。
但是,用戶通常還需要:這些值應該顯示在所有相應的行中(即也適用於女性)。
[原始帖子中帶有基準列的示例說明了為什麼這種行為是有意義的。]
使用 GroupBy,很容易獲得正確的值 - 但如何將它們分佈到所有行上。
如果後面有類似查找表的東西列...聚合函數,函數使用相同的標識符
1)將行拆分到不同的組進行聚合(“M”/“F”):
Judy 是女性,Judy 行中的體重應包含在女性平均體重
2) 作為從查找表中讀取條目時的索引(“M”/“F”):
朱迪是女性,新專欄應包含女性平均體重在朱迪那一排
因此,男性和女性要么獲得相同的值,因為標識符相同 (mean1),要么因為標識符不同而獲得不同的值 (mean2)。
因此:
Jmp用戶能使用 GroupBy 功能通過以下方式從計算中刪除值:
-計算不同的子組有不同的值
- 轉儲不需要的結果
但後來他得到了
-得到不同的子組有不同的值
免費 - 即使他沒有訂購此選項(好吧,代碼講述了另一個故事 - 但讓我們考慮一下用戶想要什麼):)
有沒有一行命令從平均值計算中刪除女性,但將值寫入帶有“女性”的相應行?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column("mean1", Formula(Col Mean(:weight, :age)));
dt << New Column("mean2", Formula(Col Mean(:weight, :age, :sex)));
dt << New Column("mean2", Formula(If(:sex=="M", Col Mean(:weight, :age, :sex))));
dtM = dt << subset( Rows( dt << get rows where( :sex== "M" ) ), selected columns( 0 ));
dtM << New Column("mean_M", Formula(Col Mean(:weight, :age)));
dt << Update(
With( dtM ),
Match Columns(:age = :age ),
Add Columns from Update Table( :mean_M ),
Replace Columns in Main Table( None )
);
回复:如何將 Col 最大公式與“where”條件一起使用一種加快速度的方法幾個數量級(!!!):
而不是非常慢的 Col Mean與 if 語句內的字符比較:
mydt << New Column( "col C", Formula( Col Mean( If( :name=="Robert", :weight, . ), :age ) ) );
使用@cwillden的技巧:使用比較作為 GroupBy 參數:
已解決:回复:獲取滿足列公式內條件的行 - JMP 用戶社區
mydt << New Column( "col C", Formula(if(:name=="Robert" , Col Mean( :weight, :age, :name=="Robert" ),. ) );
將數據分為 2 組:想要的數據和不需要的數據(下面的屏幕截圖,@10k 行 -> 速度提高 2000 倍:)
.. 然後通過 Col Mean 聚合之外的 if 語句刪除不需要的結果。
與列的比較:性別這種方法會被過度設計;這就是我切換到:姓名比較來說明概念。
這也有點過度設計,但我希望這個想法能變得清晰:)

查看更多...
回复:如何將 Col 最大公式與“where”條件一起使用我剛剛注意到:
- 這個技巧不起作用
:名字==“羅伯特”
似乎是一個特殊情況 - 比較被忽略(在 Jmp 16 和 17.1 中)。
奇怪的 ...
- 帶著對新可能性(使用條件(!)作為 GroupBy)和速度改進的熱情,我完全錯過了我或多或少回到了我開始的地方:帶有 Group By 選項的 Col 聚合。
所以,我沒有達到我的實際目標:用值填充“其他”行,如下所述:
我如何使用帶有“where-quot”的“Col-Maximum-Formula”/mp/571889/highlight/true#M78145
但有一個解決方法:而不是緩慢
New Column( "newcol", Formula(Col Mean( if(:sex=="M",:weight,.), :age ) ));
請注意,slow Col Mean 內只有 Group By 選項
...然後使用快速 Col Median 將值傳播到其他行:
New Column( "newcol", Formula(Col Median(If(:sex =="M" ,Col Mean( :weight, :age, :sex),.),:age) ));
另外:這個話題得到了 Jmp 開發團隊的一些關注:
Col Median(及其他):添加“Where”選項
@薩姆加德納寫道:
狀態更改為:我們喜歡它! (在隊列中)...我們致力於改進Where( ) 子句在整個JMP 中的使用方式。
看來很快就會有一個更簡單的解決方案來解決這個問題:)
回覆:如何將 Col 最大公式與「where」條件一起使用有趣的事實:
在字串清單中搜尋「M」比將「M」與字串進行比較要快幾個數量級:

Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
tryAgain = Function( {},
write ("\!nrows: ", nrows(mydt),"\!n");
t0 = HP Time();
mydt << New Column( "char=char", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("char=char: ",t,"\!n");
t0 = HP Time();
mydt << New Column( "contains", Formula( Col Mean( If( contains(Eval List({:sex[]}) ,"M"), :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("contains: ",t,"\!n");
If(
ex = New Window( "",
<<TYPE></TYPE><BR />why?!?<BR />Which secret is behind this finding?
回覆:如何將列最大值公式與「where」條件一起使用2025 - JMP19 在字串比較方面實現了顯著的速度提升。
涼爽的!
除此之外,建議
col Mean(:weight, :age, where(not(excluded())))
引入此方法是為了轉換報表中的欄位。它變得非常簡潔:

另一方面,要找到適用於特定聚合條件(例如:sex="M")的正確公式仍然非常困難。
<SPAN class="token function">if<SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"& not(excluded()),<BR /></SPAN> col Max</SPAN><SPAN class="token punctuation">(</SPAN><SPAN> </SPAN><SPAN class="token function">if</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>weight<SPAN class="token punctuation">,</SPAN><SPAN class="token punctuation">.</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>age, excluded()<SPAN class="token punctuation">)<BR /> , .<BR />);</SPAN>
類似
col Max(:weight, :age, @excluded, where(:sex=="M"))
可能會很有幫助。
嗯: 列中位數(及其他):新增「位置」選項:3.5 年才獲得 1 個讚? !真奇怪。