获取唯一的列值并使用它们在不同的表中进行过滤/清理您好,例如,使用数组中的键来选择或过滤具有相同键但位于不同 JMP 表中的行的方法是什么。我有两张桌子。其中之一将化学测试的样品 ID 映射到不同的因素设置(温度、时间、研究编号等)。我成功地获取了数组中的样本 ID。 (抱歉,我对此完全是新手。)
smplID = Associative array(:sampleid) << Get Keys;
现在我想使用这些键选择第二个表中的行(我的响应所在),反转行选择并删除行。到目前为止, 这个参考资料对我毫无帮助。也许下面的解决方案,正如这里所描述的,更适合从?
Summarize(dt, smpleID = by(:sampleid));
或者也许这种方法更好?
dt << Summary (Group ( :sampleid ), Frequ( "None" ), Weight( "None" );
无论如何,我真正想知道的是,在进一步进行数据分析之前,如何使用这些方法中的任何一种来有效地清理数据表中不需要的行。我想我需要学习如何循环。
是的,我会尽可能通读脚本指南。我只是无法确定优先顺序。
大规模定制回复:获取唯一的列值并使用它们在不同的表中进行过滤/清理就是这样。 我需要非常小心表操作。 否则我可能会放错一些重复测量。 因此,我试图提前清理表格,因为这有助于维护概览。
回复:获取唯一的列值并使用它们在不同的表中进行过滤/清理对于这么多的行,这些方法会很快!
我想到了另一种解决方案,您可以首先创建摘要表,然后将其加入到要从中删除找到的值的表中。
以 JMPs Cars.jmp 和 Cars 1993.jmp 样本数据为例。 Cars 1993 将是我们将使用 Model 列过滤 Cars 的一种数据。
1. 从 Cars 1993 创建汇总表,模型为组
2. 使用以下设置将该新汇总表加入 Cars 表:

3. 从新的匹配标志列中,您可以看到两个值:Both 和 Main。 两者都意味着可以从两个数据集中找到模型
我认为您可以直接使用 Cars 1993 执行此操作,但您必须小心重复(使用 Table 放置倍数可能会解决这个问题,不确定)。 同样在这种情况下,您需要选择要保留的列,因为会有重复(至少在这个例子中)。

由于 JMP 可以完成大部分脚本,因此它们也可以相当容易地编写脚本。
回复:获取唯一的列值并使用它们在不同的表中进行过滤/清理谢谢,这对我帮助很大! 我不确定“大量数据”的真正含义。 我今天打开的第一张表包含大约 400 行,但随着我们组织中实验室信息管理系统 (LIMS) 的持续实施,这个数字必然会增长。 我猜随着时间的推移会有数千行,甚至可能多达一万行。 对我来说,我正在“清理”所有无关样本 ID 的第二张表已经有大约 50 000 行。
到目前为止,在实施了您的解决方案后,我正在使用一组示例 ID。 (虽然我觉得我的技能非常有限,但脚本编写仍然感觉非常有价值,并且在找到解决方案时感到满意,即使它被社区“撕掉”。 所以再次非常感谢你。)
回复:获取唯一的列值并使用它们在不同的表中进行过滤/清理要获得唯一值,所有这些都是有效的方法,它们的速度将取决于您拥有的数据量。 需要注意的一点是,如果您想获取唯一的数字值并使用 Summarize,则必须将它们转换回数字(Summarize 将它们作为字符串返回)。
获得唯一值的一些不同方法:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
aa_uniq = Associative Array(dt:age) << get keys;
Summarize(dt, summarize_uniq = by(:age));
dt_summary = dt << Summary(Group(:age), Freq("None"), Weight("None"), private);
summary_uniq = Column(dt_summary, 1) << get as matrix;
Close(dt_summary, no save);
Show(aa_uniq, summarize_uniq, summary_uniq);要从数据表中选择值,您可以使用包含和选择位置。 可能不需要反转行选择,因为您可以使用! (或 Not())来否定你从函数中得到的结果。 在这里等待只是为了演示:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
names_of_interest = {"KATIE", "LILLIE", "JOHN"};
wait(2);
dt << Select Where(Contains(names_of_interest, :name)) << Invert Row Selection << Hide and Exclude(1);// << clear select;
//Remove selections
wait(2);
dt << Clear Row States;
wait(2);
dt << Select Where(!Contains(names_of_interest, :name)) << Hide and Exclude(1);// << clear select;此外,如果您有大量数据,这可能不是最有效的方法,但很可能是最简单的,我会从它开始。