我經常使用公式列通過其他分類列的某種組合來總結列。例如,在洗滌劑樣本數據中,我可能想知道柔軟度和溫度的每種組合的平均計數。 以下是執行此操作的三種方法,我使用哪一種取決於數據表的大小以及我的受眾是誰。有更容易的方法嗎?
由於可移植性問題,我迴避包含自定義“Col Mean by Multiple Columns()”函數的加載項。
製表
使用 tabulate 在新表中創建匯總統計信息,然後將結果連接到原始數據表。
優點:輕鬆進行非常複雜的匯總統計。
缺點:不是實時的,如果在分析過程中引用的列發生更改,則需要刷新數據,用戶無法跟踪數據源。
分檔公式
創建一個分箱公式,然後使用 Col Mean() 函數的第二個參數來引用該分箱。
優點:易於設置,並且用戶相對容易遵循。
缺點:創建額外的列,使數據表變得混亂,並且除此公式外沒有任何用處,尤其是在創建許多匯總列時。
dt = Open( "$sample_data/Detergent.jmp" );
//binning formula
dt << New Column(
"Bin by Temp and Softness",
Character,
"Nominal",
Formula( :softness || "-" || :temperature )
);
//summary statistic
dt << New Column(
"Mean Count by Temp and Softness Binned",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Col Mean( :count, :Bin by Temp and Softness) )
);
在公式中使用 JSL 識別數據箱併計算匯總統計數據
識別數據表中的相似行,然後計算該數據的匯總統計量。我懷疑 JMP 不會使用此方法緩存結果,因此會針對每一行重新評估整個表。 無論如何,對於大數據表來說,速度很慢。
優點:極大的靈活性
缺點:計算速度慢,用戶很難理解。
//summary statistic by bin
dt << New Column(
"Mean Count by Temp and Softness Direct",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
matches = Function( {a, b},
out = {};
For( i = 1, i <= N Items( a ), i++,
found = "no";
For( j = 1, j <= N Items( b ), j++,
If( a[i] == b[j],
found = "yes"
)
);
If( found == "yes",
out = Insert( out, a[i] )
);
);
out;
);
soft = Loc( :softness << get values(), :softness );
temp = Loc( :temperature << get values(), :temperature );
Mean( (:count << get values())[matches( soft, temp )] );
)
);太好了,我很高興有幫助! 我應該提到,在最新版本的 JMP 中(我認為自 JMP 11 起),您可以直接在 ColMean() 中擁有多個列參數。 因此,您可以不串聯:
Col Mean( :count, :softness, :temperature )
我已經習慣了連接起來我仍然這樣做。舊習難改 :)
此外,在 JMP 12 及更高版本中,通過數據表中的即時公式,您可以選擇表中的這些列,右鍵單擊其標題之一,然後選擇新建公式列 > 分組依據。

然後,選擇計數列,右鍵單擊標題,選擇新建公式列 > 聚合 > 平均值

這將自動為您設計公式;對您的新用戶非常友好。
你好@ih ,
我發現自己經常做這件事。 對我有用的一種方法是使用像 Col Mean(:column, byvariable) 這樣的列公式,對於第二個參數,我直接使用兩個分類列的串聯(而不是在表中創建任何其他列)。 對於您提到的洗滌劑示例,這將是:
Col Mean( :count, :softness || :temperature )
這是否滿足您的需要,或者還有您正在尋找的其他東西?
@朱利安