创建公式: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 )
);
公式会更好,因为它也会自动更新。
让我们知道它是否有帮助。
罗恩