創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?假設我正在使用 Big Class 數據集,並想為同齡最矮學生的平均體重創建一個新列 - 我該如何設置?
我知道如何做第一點(找到同齡最短學生的身高),這只是帶有 byVariable 的 Col Mean:
Col 最小值(:身高,:年齡)
但是我不知道該怎麼做是然後取那些學生子集的平均體重,其中(A)該學生的年齡與該行中學生的年齡相匹配,以及(B)該學生的身高與同齡學生的最低身高相匹配。
數據表回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?太棒了,謝謝! 你每天都會學到兩件新東西:)
要將您的 Cars 公式合併為一列,如下所示:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?我附上了帶有一些不同公式的數據表,並分成了多個(我之前的汽車可能由於非最大權重分組而出現了一些問題)。 這也可以讓你看到如果有關係會發生什麼。
: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]);回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?謝謝@jthi ,效果很好!
為了確保我理解,看起來 If 語句正在創建一個“虛擬”列,該列會取消高度不是該年齡最小高度的任何行,然後它使用 Col Mean 對該“虛擬”列進行操作。 好把戲!
在我看來,汽車示例的公式不起作用 - 例如,即使最重的雪佛蘭(Suburban)是“mpv”,該公式也會為雪佛蘭返回“pu”,而為克萊斯勒返回“med”,即使最重的克萊斯勒(第五大道)是“hev”。 無論如何,對於我的應用程序,您已經使用 Big Class 的公式解決了這個問題 - 但是,出於好奇和進一步我的 JMP-fu,我很想了解更多關於最終公式中發生的事情。 括號運算符有什麼作用,例如“:Size[...]”?
回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?您可以使用公式(獲取年齡組中最小權重的平均值)來做到這一點:
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)]
吐出多個不同的公式,看看它是如何工作的
回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?你好@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 />
到目前為止,我還想知道不排序的直接公式解決方案。
如果您以後需要重新使用數據,只需刪除公式或禁止評估。
回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?謝謝羅恩。 我認為這對我有用(儘管能夠在同一個數據表中做到這一點會很好。)
為了讓它更容易,我的實際應用程序最好使用查找而不是平均值 - 我將取最大值的列是時間戳,我們可以假設每個組都有一個唯一的行最近的時間戳。
因此,例如,使用 Cars 數據集,我的問題是:
創建一個“Size of Max Wt for Make”列,在所有具有相同 Make 的汽車中找到具有最高 Wt 的汽車,然後查找該最大 Wt 汽車的 Size。
回复:創建公式:Col A 在 Col C 組中 Col B 最小的行的平均值?你好@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 )
);
公式會更好,因為它也會自動更新。
讓我們知道它是否有幫助。
羅恩