我经常使用公式列通过其他分类列的某种组合来总结列。例如,在洗涤剂样本数据中,我可能想知道柔软度和温度的每种组合的平均计数。 以下是执行此操作的三种方法,我使用哪一种取决于数据表的大小以及我的受众是谁。有更容易的方法吗?
由于可移植性问题,我回避包含自定义“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 )
这是否满足您的需要,或者还有您正在寻找的其他东西?
@朱利安