创建公式: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 )
);
公式会更好,因为它也会自动更新。
如果有帮助请告诉我们。
罗恩