相当于 Excel 中的 Index(Match())我有一些数据,我想计算每个唯一 ID 的第一次测量和所有后续测量之间的百分比误差。我一直无法弄清楚如何根据其他行列的值从一个单元格获取数据。这是否需要 JSL,或者我是否可以像在 Excel 中一样创建一个公式。
我希望使用公式来计算我突出显示的两列,但实际集合中有数千行数据,我可以理解它是否必须是一个脚本并且值是静态的直到再次运行该脚本。

任何帮助都将不胜感激。
我正在使用 JMP 16。
基础数据分析与建模回复:相当于 Excel 中的 Index(Match())您可以使用 Col Min(Row(), :ID) 获取最早的测量值
:Measurement[Col Min(Row(), :ID)]
然后,您可以在单独的列中使用它,或者仅将其用作计算结果的单个公式的一部分
回复:相当于 Excel 中的 Index(Match())谢谢,有效。
但我确实有一个担心;如果我想对每个 ID 使用第二个值怎么办?
因此对于 ID == A,我将在“最早测量”列中得到 10.00001。
回复:相当于 Excel 中的 Index(Match())有很多不同的选项,但它们可能有点难以理解。“最简单”的想法是将 Col 统计函数与 if 语句结合起来,if 语句返回缺失值或您要查找的值。
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

使用 Col 统计函数的好处是它们可以很好地用于分组列和公式。
回复:相当于 Excel 中的 Index(Match())我认为最“类似 JMP”的方法是交互式解决方案,让 JMP 创建自动化流程(使用增强日志/工作流生成器),然后修复 JMP 创建的脚本留下的“问题”:
由于您已经有了 Order 列,我假设您可以使用它,请创建仅 Order == 2 的子集。右键单击 -> 选择匹配的单元格 -> 创建子集


从子集中将“测量”列重命名为其他名称。然后返回原始表并使用“更新”将子集重新连接到表中,并使用 ID 作为匹配条件列

现在,您已在一列中获得了二阶测量值。JMP 将为您编写如下脚本:
// Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
// Subset data table
// → Data Table("Subset of JMP Example")
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Copy formula(0), Selected Rows(1), Selected columns only(0));
// Change column name: Measurement → Measurement_ORDER2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement_ORDER2");
// Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
这肯定不是最好的脚本,但它确实有效,并给出了正在做什么的想法。您还可以在开始此过程之前启动工作流记录,并创建工作流来自动化此过程(我个人不使用工作流,更喜欢增强日志,但它们可能非常有用,特别是如果您希望自动化某些事情)。工作流生成器创建的脚本可能看起来像这样
Names Default To Here(1);
Workflow 6=function({},
step_name = "Open Data Table: JMP Example.jmp";
//Open Data Table: JMP Example.jmp
Open("$DOWNLOADS/JMP Example.jmp");
step_name = "Select matching cells";
//Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
step_name = "Subset data table";
//Subset data table
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Selected Rows(1), Selected columns only(0));
step_name = "Change column name: Measurement → Measurement2";
//Change column name: Measurement → Measurement2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement2");
step_name = "Update data table";
//Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement2),
Replace Columns in Main Table(None)
);
step_name = "Close Data Table: Subset of JMP Example";
//Close Data Table: Subset of JMP Example
Close(Data Table("Subset of JMP Example"), NoSave);
);
Workflow 6();
通常,工作流生成器创建的脚本确实存在与增强日志创建的脚本类似的问题,但工作流确实具有额外的好处(如果您希望这样看待它们,我认为它们除了更新参考等非常简单的事情之外,大多数情况下都是令人烦恼的)。下面是我将如何修改 JMP 创建的脚本
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
dt << Clear Column Selection << Clear Select;
rows_of_interest = dt << Get Rows Where(:Order == 2);
dt_subset = dt << Subset(Rows(rows_of_interest),
Copy formula(0),
Selected columns only(0),
Invisible
);
Column(dt_subset, "Measurement") << Set Name("Measurement_ORDER2");
dt << Update(
With(dt_subset),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
Close(dt_subset, no save);
这些也可以使用“更高级”的 JSL 来完成,但一般来说,如果你想使用公式并避免使用 JSL,我不会使用它们。只有在需要速度的情况下才可以使用它们,即使在这种情况下,除非你对它们进行优化,否则它们有时可能会变得更慢。这是一个使用 JSL 的选项,并附有一些注释来解释
查看更多...
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
// Get all IDs into a list using data table subscripting
ids = dt[0, "ID"];
// Get all unique IDs using Summarize (there are many other methods)
// Note that Summarize will change numeric values to strings (doesn't matter in this case)
Summarize(dt, uniq_ids = By(:ID));
// We can loop over the unique IDs while collecting results
// I will store results to Associative Array as it is efficient method and easy to access
aa_idpos = Associative Array();
aa_meas = Associative Array();
idx_of_interest = 2;
For Each({cur_id}, uniq_ids,
// We can use Loc to find specific ID from a list of IDs
cur_idx = Loc(ids, cur_id);
// From this we can pick second index for example and store it to our aa
// Note: Usually you want to check that there is at least two items if you do this
aa_idpos[cur_id] = cur_idx[2];
// You could also get the Measurement value instead
// (I prefer index as then I can access value from any of the columns easily)
aa_meas[cur_id] = :Measurement[cur_idx[idx_of_interest]];
);
// Show(aa_idpos);
// Then you can basically do whatever you want with these
// Fill them into the table for example by using Formula OR For Each Row
// Formula tends to be faster if you just need one column
new_col = dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa_meas[:ID]
));
// aa_meas WON'T be evaluated unless you specifically do it, so either remove the formula
// or evaluate it using eval(evalexpr()) / eval(substitute())
dt << run formulas;
new_col << Delete Formula();
<BR />/*
// or evaluation (one option, there many other options (local variables, not worrying about the scope, ...))
new_col = Eval(EvalExpr(
dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa = As Constant(Expr(aa_meas));
aa[:ID]
));
));<BR />*/
回复:相当于 Excel 中的 Index(Match())如果你知道你的数据是有序的,就像它们在样本数据表中一样,并且假设总会有第二个值,那么
:Measurement[Col Min( Row(), :ID ) + 1]
是使用系列中第二行的一个非常简单的方法。
回复:相当于 Excel 中的 Index(Match())按照@txnelson的建议,您也可以使用它:

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]
这将返回每个 ID 的第二个测量值。
@JasonWS
我制作了这个 PowerPoint,向 JMP 新用户介绍如何在 excel 中执行类似 vlookup 的操作。希望它也能有所帮助。
史蒂夫
希望有帮助!
回复:相当于 Excel 中的 Index(Match())如果您想要聚合多个条目以供参考 - 或者存在排除的行,则主题会变得更加复杂。
除此之外,如果您在日常工作中经常应用此类计算,您就不想一次又一次/手动地创建公式。
愿望清单新公式栏中有一个愿望/分布:“规范化” 。
但其他用户的兴趣相当低 - 只有 2 个 Kudos...
因此,我听从了@mia_stephens 的建议

...并开发了我自己的插件。它可以在市场上找到:
https://marketplace.jmp.com/appdetails/Normalization+GUI
该插件提供了一个用户界面来自动生成此类计算。
除了许多其他选项之外,还有“第一个”、“最后一个”和“N-1”的选项。

也可以使用第二个条目进行规范化。
只需激活

并使用@shampton82解释的 Rank/Order 列:

最后,公式将如下所示:

与@shampton82的方法非常相似:
它使用Col ...聚合将参考值分发到其他行。
细微的差别:它分配的是值而不是行索引。