如何识别数据组中的最大值和最小值假设我把大班的所有学生按性别和年龄分组,例如 12 岁的男孩分在一组,12 岁的女孩分在另一组,等等。
通过该设置,我想创建一个公式列,如果该组在两种性别中拥有与其年龄相符的最矮最大身高,则该列为 1,否则为 0。
例如,在此数据中:
| 团体 | 姓名 | 高度 | 新专栏 |
| 12 岁女孩 | 凯蒂 | 59 | 0 |
| | 简 | 55 | 0 |
| | 杰克琳 | 66 | 0 |
| | 莉莉 | 52 | 0 |
| 12 岁男孩 | 蒂姆 | 60 | 1 |
| | 詹姆斯 | 61 | 1 |
| | 罗伯特 | 51 | 1 |
女孩的最大身高为 66 岁,男孩的最大身高为 61 岁,因此男孩组的最大身高是同龄人中最低的,所以新公式列中 Tim、James 和 Robert 的身高为 1,Katie、Louise、Jane 等的身高为 0。
这在公式列中可能吗?
(我可以分享我尝试过的方法,但我试图避免 xyproblem, http://xyproblem.info这里...)
基础数据分析与建模数据探索与可视化回复:如何识别数据组中的最大值和最小值您可以使用 Col...聚合。
编辑:如果有人询问每个年龄组身高最小的学生的性别:
首先使用 Col Min 查找每个年龄段身高最小的学生。
然后使用 Col Max 将这些知识传播给所有同性别的学生。
所以:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
正如你要求的那样
如果该组在男女同龄人群中身高最矮,则公式列为1,否则为 0
必须纠正这种方法
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
遵循以下想法:
- 各年龄和性别的最大身高是多少
- 取值并找出每个年龄的最小(最大)身高
- which student?
[啊,不,我们不想要随机的学生,我们只想要身高最大的学生!]
-> replace :height with Col Maximum( :height, :age, :sex ) *) </CODE>use col max to spread the 1 to all other students with the same sex and age</STRIKE><BR /><STRIKE>如果有身高相同的男孩和女孩,则将另一个性别设置为 0 或 1。</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">这部分我们不再需要了</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">...我们最终得到了 Jarmo 的解决方案(见下文)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">回复:如何识别数据组中的最大值和最小值</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>XY问题:<BR />谢谢 : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">回复:如何识别数据组中的最大值和最小值</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>哇,这似乎有效,但我的大脑甚至无法理解它是如何工作的......</P><P> </P><P>让我试着在这里解释一下,也许你可以帮助我理解——</P><P> </P><P>以以下项开头:Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age )</P><P> </P><P>Col Minimum( :height, :age ) --> 返回该年龄所有学生的最低身高</P><P> </P><P>:height == Col Minimum( :height, :age ) --> 如果此行的高度列与最小高度匹配,则返回 true/false (1/0)</P><P> </P><P>列最大值(<此行的 1 或 0>,:性别,:年龄)——>呃……这没有意义,我以为列最大值是通过按分组列(:性别,:年龄)对数据进行分组来实现的,然后找到第一个参数中的值或列的列最大值——现在只是一个真/假或 1/0——然后返回此行组的相应最大值,即此行的:性别和:年龄的值。</P><P> </P><P>显然这是错误的,我在这里遗漏了什么?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">回复:如何识别数据组中的最大值和最小值</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>有很多方法可以做到这一点,例如使用 col 统计函数的不同组合(如已经显示的那样)。这里还有其他选项(我认为它应该可以满足您的要求)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
首先 Col Min() 查找年龄、性别组中超过年龄的 Col Max(),然后将其与年龄、性别组的最大值进行比较,如果与年龄组的最小值相同 -> 值为 1。
为了更容易地理解这些,我认为将它们全部写出来作为单独的部分并使它们更容易理解是有益的,在这种情况下:
First column with Col Max(:height, :age, :sex) (max_height_for_agesex)
- Next column then utilizes that
Col Min(:max_height_for_agesex, :age) age_minmax_age
- And the final one is the comparison of these two
:max_height_for_agesex == :age_minmax_age
回复:如何识别数据组中的最大值和最小值谢谢@jthi——不过我还是很困惑。
从这个开始:
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
当 JMP 评估“Col Max(:height, :age, :sex)”时,它返回什么?单个值?还是列表?
我可以以此为公式创建一个新列,它会生成一个最终出现在该列的行中的值列表。
但在公式中,它似乎返回单个值,例如:
a = col max(:height, :name);
type(a);
... 返回“数字”。
如果我创建一个新脚本并输入:
a = col max(:height, :name); <BR />show(a);
它显示“无效的行号”,但如果没有“,:name”,它就可以正常工作并返回 70。看起来 JMP 正在使用这些函数执行某种上下文特定的操作。这是如何工作的?有解释吗?
回复:如何识别数据组中的最大值和最小值当您在单元格中运行公式列的公式时,它会计算当前行的值。
当您在 JSL 中运行它时,它会为当前行进行计算。
听起来一样。但是“当前行”的默认值是“第 0 行” - 即没有有效数字。
您还可以检查任何行的计算 - 与默认值“0”不同。
只需在计算前面放置row()=xy即可对行xy进行计算。
例如
row()=5;
col max(:height, :age)
将返回 66。
:第 5 行的年龄为12 ,年龄 =12的最大身高为66 。
回复:如何识别数据组中的最大值和最小值我猜它的工作原理是这样的:
Col...首先遍历所有行并存储第一个参数的结果。
它逐行计算 - 例如,如果第一个参数是随机 uniform() 。
此外,它还存储了附加分组参数的查找表。
然后它将数据分成子集,计算聚合值 - 然后将聚合值分配回相应的行。
回复:如何识别数据组中的最大值和最小值
当 JMP 评估“Col Max(:height, :age, :sex)”时,它返回什么?单个值?还是列表?
单一值。
如果您创建了一个脚本并希望测试正在发生的事情,那么如果您使用按列,则必须使用 Row()(如果不使用按列,它将正常工作,因为 JMP 知道使用所有行)。在 JMP 中,Row() 默认为 0,因此您必须将其更改为 Row() = 1。我想我在 JMP 帮助或脚本索引中看到过一些有关此内容的文档,但不知道在哪里(可能与 Row()、For Each Row 或 Col 统计函数有关)。
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
max_height = Col Max(:height); // works fine as no by var used and uses all rows
Show(Row());
Col Max(:height, :age); // won't work as JMP doesn't know which age to use -> it needs row information
Row() = 1;
cur_age = :age;
cur_maxheight = Col Max(:height, :age);
Write("\!Max height for age ", cur_age, " is ", cur_maxheight);回复:如何识别数据组中的最大值和最小值听起来你是说 JMP 将整个列公式包装在一个循环中,该循环在表的行上迭代“Row()”,计算每一行的值。
除了这个表达式之外,这 * 是 * 有意义的:
Col Min(Col Max(:height, :age, :sex), :age)
... 按照这种逻辑,当 Row() 设置为 i=1 时,它会将 Col Max() 计算为整个表格的 :height 列中的最大值,其中 :age[i] == :age[1] 和 :sex[i] == :sex[1],这将返回一个数字。然后,它会尝试计算该单个数字的 Col Min(),根据定义,该数字只能是该数字。我真的很难理解这一点。
我一直认为 Col Max() 必须返回一个列表,然后 Col Min() 可以查看该列表的所有行,其中:age[i] == :age[1]。
但是我的想法是要求 JMP 执行与 perl 类似的操作,基本上是跟踪某个函数是在标量上下文中还是在列表上下文中被调用,即如果函数的使用方式需要返回列表,则返回列表,否则返回标量。这样,这里的 Col Max() 可以为 Col Min() 返回一个列表,而后者又会返回标量值。
我猜我这里遗漏了一些东西,但又说不上来。
回复:如何识别数据组中的最大值和最小值不,其思想并不是 JMP 逐行遍历表并计算整个表达式。
回复:如何识别数据组中的最大值和最小值为了研究 JMP 正在做什么,让我们首先创建一个非常小的数据表...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt = dt0 << Clear Select << Select Rows( [2, 10, 11, 25] ) << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
nr = n rows(current data table());
...以及具有一些对数功能的公式列:
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));输出:

因此,对于这种情况,JMP 会运行代码几次。
稍后再想想吧……
回复:如何识别数据组中的最大值和最小值现在让我们检查一下
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
...我们得到*)

这表明:
- 举个简单的例子,JMP 计算每一行的Col Min的第一个参数
- 对于第二个版本,JMP 会评估每一行的Col Min的第一个参数- 并且由于此代码中还有另一个Col...聚合,因此接下来是ColMax循环:每一行的Col Max的第一个参数
最后,JMP 知道每一行的ColMax(...)的值,然后可以使用这些值来评估Col min 。
这或多或少就是您所说的 - 使用列表上下文。但我认为 JMP 将结果存储在数据表上下文中。这样它就可以将值与row()、row states() 等附加信息结合起来。
但是 JMP 的某个人 - 或者@jthi - 可能会解释得更好......
*)再次:多次:
更多详细信息请参见此处:
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-possibility-bugged-on/mp/613887/highlight/true#M81398
回复:如何识别数据组中的最大值和最小值测试代码执行的另一种方法:
i = 0;
j = 0;
New Column( "test",
Formula(
Col Min(
i++;
Col Max(
j++;
:height;,
:age,
:sex
);,
:age
)
)
);
// too early
Show( i );
Show( j );
Current Data Table() << run formulas();
// after calculating the values
Show( i );
Show( j );

我 = 5 x 4
j = 5 x 5 x 4
回复:如何识别数据组中的最大值和最小值-
回复:如何识别数据组中的最大值和最小值Col 统计函数确实有自己的魔力,而其他一些函数则没有,例如它们具有内部缓存和支持 byvars。https
/www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
回复:如何识别数据组中的最大值和最小值是的,这种准备数据的巧妙方法非常有用:
魔法如何发挥作用的例子:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Clear Select << Select Rows( Index( 5, 40 ) ) <<DELETE rows=""></DELETE>newCol << Set Formula(Col Min(Print(row());:height,:age)); // 2 x 4<BR /><BR />newCol << Set each value(Col Min(Col Max(Print(row());:height,:sex),:age)); // 4 + 4
newCol << Set Formula(Col Min(Col Max(Print(row());:height,:sex),:age)); // 2 x 4 + 4
请确保您不会遇到以下任一情况:
i=1;<BR />newCol << set each value (Col Min(Print("X");:height,:age)); // 16 = 4 x 4
newCol << set Formula (Col Min(Print("X");:height,:age)); // 20 = 5 x 4<BR />newCol << set Formula (Col Min("x";Print(3);:height,:age)); // 20 = 5 x 4
newCol << Set Formula(Col Min(i;Print(row());:height,:age)); // 20 = 5 x 4<BR />
newCol << set each value (Col Min(Col Max(Print("X");:height,:sex),:age)); // 80 = 5 x 4 x 4
newCol << set Formula (Col Min(Col Max(Print("X");:height,:sex),:age)); // 100 = 5 x 5 x 4<BR />newCol << set Formula (Col Min(Col Max("X";Print(3);:height,:sex),:age)); // 100 = 5 x 5 x 4
newCol << Set Formula(Col Min(Col Max(i;Print(row());:height,:sex),:age)); // 100 = 5 x 5 x 4
当他们看到
然后他们切换到较低的速度并计算分层树中每一行的每个值(+1)...
回复:如何识别数据组中的最大值和最小值我不确定我是否足够聪明,能够理解你在这里所做的一切——
听起来你同意我的观点?也就是说,Col ... 函数在标量和列表上下文中执行不同的操作?
回复:如何识别数据组中的最大值和最小值我们等一年再讨论吧——事情可能会改变。