創建公式:C 列中 B 列最小的行的 A 列平均值?假設我正在使用 Big Class 數據集,並且想要為同齡最矮學生的平均體重創建一個新列 - 我該如何設置?
我知道如何做第一步(找到同齡最矮學生的身高),這只是帶有 byVariable 的 Col Mean:
列最小值(:身高,:年齡)
但我不知道該怎麼做,然後取這些學生子集的平均體重,其中(A)該學生的年齡與該行中學生的年齡相匹配,以及(B)該學生的身高符合同齡學生的最矮身高。
數據混合和清理回复:創建公式:C 列中 B 列最小的行的 A 列平均值?太棒了,謝謝! 你每天都會學到兩件新東西:)
要將汽車公式合併到一列中,如下所示:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
回复:創建公式:C 列中 B 列最小的行的 A 列平均值?我附上了帶有一點不同公式的數據表,並分成多個(我之前的汽車數據表可能由於非最大重量分組而存在一些問題)。 這還可以讓您了解如果存在平局會發生什麼。
:Size[idx] 允許您訪問具有指定 idx 的 :Size 列中的值,您還可以使用 :Size[[1,2,3]] 訪問多個值(例如,這可能會有所幫助)數據表下標)
在腳本窗口中運行此命令,查看日誌並將其與數據表進行比較:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);回复:創建公式:C 列中 B 列最小的行的 A 列平均值?謝謝@jthi ,效果很好!
為了確保我理解,看起來 If 語句正在創建一個“虛擬”列,該列使高度不是該年齡的最小高度的任何行無效,然後使用 Col Mean 對該“虛擬”列進行操作。 好技巧!
在我看來,汽車示例的公式不起作用 - 例如,即使最重的雪佛蘭(郊區)是“mpv”,該公式也會為雪佛蘭返回“pu”,並且為克萊斯勒返回“med”最重的克萊斯勒(第五大道)是“hev”。 無論如何,對於我的應用程序,您已經使用Big Class 中的公式解決了問題- 但是,出於好奇並為了進一步發展我的JMP-fu,我很想了解有關最終公式中發生的情況的更多信息。 括號運算符的作用是什麼,例如“:Size[...]”?
回复:創建公式:C 列中 B 列最小的行的 A 列平均值?您可以使用公式來完成此操作(獲取年齡組中最小體重的平均值):
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
將公式拆分為兩個不同的公式,使其更容易理解:
最小重量值:
If(:height == Col Min(:height, :age),
:weight,
.
)
然後是該值的平均值:
Col Mean(:MinWeightVal, :age)
Col Mean 會忽略缺失值,所以這應該有效
對於汽車(不太確定您希望數據如何顯示:
品牌最大重量:
Col Max(:Wt, :Make)
如果您只想將其排成一排,則重量尺寸:
If(:Wt == :Max Wt for Make,:Size,"")
多行的值相同,您很可能可以從那裡刪除一些 Col 函數,但這是我很快想到的最簡單的函數:
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
吐出多個不同的公式來看看它是如何工作的
回复:創建公式:C 列中 B 列最小的行的 A 列平均值?你好@markschwab ,
如果您有能力對錶格進行排序,請嘗試以下操作:
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
現在我還想知道不排序的直接公式解決方案。
如果您需要稍後重新使用數據,只需刪除公式或抑制評估即可。
回复:創建公式:C 列中 B 列最小的行的 A 列平均值?謝謝羅恩。 我認為這對我有用(儘管能夠在同一個數據表中做到這一點會很好。)
為了讓事情變得更容易,我的實際應用程序最好使用查找而不是均值 - 我將取最大值的列是時間戳,我們可以假設每個組都有一個唯一的行,其中最近的時間戳。
例如,使用汽車數據集,我的問題是:
創建“品牌最大重量尺寸”列,查找具有相同品牌的所有汽車中重量最高的汽車,然後查找該最大重量汽車的尺寸。
回复:創建公式:C 列中 B 列最小的行的 A 列平均值?你好@markschwab ,
在有人向我們展示使用列公式的時尚方法之前,您可以嘗試以下操作:
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
公式會更好,因為它也會自動更新。
如果有幫助請告訴我們。
羅恩