JSL 代码和总结帮助大家好,JMP社区,
JMP Pro v17。
我有一个脚本,上个月还在运行,但现在似乎不再运行了。我有一张数据表,其中有一列名为 :Date(请参阅附加的数据表)。以下脚本应该按 :Date 的 Year( ) 汇总数据表,并为变量“yrs”生成年份列表。
Summarize( dt, yrs = By( Year( :Date ) ) );
例如,它应该返回一个日期列表,如 {“2022”、“2023”、“2024”} 等等,因为 Year() 命令应该从 :Date 列中提取年份值,但它却没有。
如果删除 :Date 周围的 Year() 命令并像这样运行它:
Summarize( dt, yrs = By( :Date ) );
结果是所有单个日期的列表,以下是摘录:
{“09/29/0263”,“01/30/1930”,“02/11/1955”,“05/03/2002”,“08/13/2002”,“10/19/2002”,
“01/01/2021”、“01/02/2021”、“01/06/2021”、“01/18/2021”、“01/30/2021”、“02/12/2021”、
“2021年2月13日”、“2021年2月15日”、“2021年3月26日”、“2021年3月27日”、“2021年3月28日”、“2021年3月30日”、
“2021年4月23日”、“2021年4月24日”、“2021年4月25日”,}
有一些输入错误的日期,但现在可以忽略。
我实际上并不需要所有单独的日期,我只想要所有年份的列表。不幸的是,当我尝试执行 yr = Year( :Date) 时,我得到的是 yr 的 null/空变量。这最终无法通过原始 JSL 中围绕它的下一个 By( ) 命令进行评估。我不知道我是否需要
我觉得奇怪的是,大约一个月前,当我构建此代码时,它似乎运行良好,但现在它却无法像以前那样运行。
我确信我遗漏了导致此问题的某些简单因素,但我不知道它是什么。或者,我正在考虑 Summarize() 和/或它如何使用其中的 By() 组。
感谢您的任何想法/反馈!,
DS
自动化和脚本大规模定制视窗回复:JSL 代码和总结帮助你好,
您需要按如下方式评估年份函数:
Eval(Eval Expr(summarize (dt, yr = By(Year(:Date)))));
最好的,
TS
回复:JSL 代码和总结帮助我不认为您可以使用 Summarize 来做到这一点,但如果您不想在表中创建新列,您可以使用带有转换列的 Summary
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
Show(years);
回复:JSL 代码和总结帮助你好@Thierry_S和@jthi ,
感谢你们两位的快速反馈和想法。不过我可能太快将其标记为已解决,因为刚刚发生了一些奇怪的事情。
我尝试运行@Thierry_S的 Eval(Eval Expr()) 并将其包含在汇总命令中,当我在测试数据表(仅包含日期的表)上测试它时,它起作用了,但是当我移动到原始数据表时,它就停止工作了,并且出现以下错误:在访问或评估“年份”时未找到列,年份/*******/(:日期)。
现在,当我返回并尝试在日期的“假”数据表上执行此操作时,我再次收到错误。
@jthi ,您的选择是可行的,但我需要将其从矩阵(或一维向量转换为数字列表)——有什么快速的方法吗?我需要这样做,因为我在关联数组中使用了年份列表。
谢谢!,
DS
回复:JSL 代码和总结帮助关联数组中的键是整数还是字符串?如果是整数,则可以使用 As List())
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(As List(years)); // As List(years) = {263, 1930, 1955, 2002, 2021, 2022, 2023, 2024, 2025};
如果它们是字符串,我会将列更改为字符,然后获取值
Names Default To Here(1);
dt = Open("$DOWNLOADS/Date.jmp");
dt_summary = dt << Summary(
Group(Transform Column("Year", Formula(Year(:Date)))),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Summary of Date grouped by Year"),
Private
);
Column(dt_summary, 1) << Set Data Type("Character");
years = dt_summary[0, 1];
Close(dt_summary, no save);
show(years); // years = {"263", "1930", "1955", "2002", "2021", "2022", "2023", "2024", "2025"};
回复:JSL 代码和总结帮助我有一个上个月一直在运行的脚本
也许是由于预先存在的列?

回复:JSL 代码和总结帮助Summarize 与 Transform 列配合使用:
dt = Open( "$SAMPLE_DATA/Hurricanes.jmp" );
dt << Transform Column( "tmp", Formula( year(:date) ) );
Summarize(years = by (tmp));
//dt << Delete Columns( :tmp );
Show(years)
如果您忘记删除转换列,请不要担心,它将在下次“打开”后消失。
回复:JSL 代码和总结帮助嗨@jthi ,
感谢您的反馈和建议。我确实需要将年份作为字符串,因为我最终会在组合框中使用它们,而组合框只接受字符串。
感谢您的所有帮助和故障排除!
DS
回复:JSL 代码和总结帮助嗨@hogi ,
所有数据表的列名都相同:Date,而且都是数字的连续列,所以我不确定为什么以前有效而现在无效。而且,奇怪的是,它适用于 Hurricanes.jmp 数据表,但对我的数据表无效。我真的不明白为什么会发生这种情况,但确实如此。
无论如何,Jarmo 建议的方法效果很好,并且不会像 Summarize(By( )) 命令那样变得繁琐。
谢谢!,
DS
回复:JSL 代码和总结帮助对于 Hurricanes.jmp,它由于:year列而有效。
JMP 将年份(:日期)重新路由为:年份?!?
回复:JSL 代码和总结帮助嗨@hogi ,也许吧。我完全不知道,也不明白为什么 JSL 会这样做。我刚刚测试了这个理论,果然,Summarize 命令不起作用,因为 :Year 列不见了。真奇怪!而且,即使 :Date 列是 Hurricanes.jmp 文件中的公式,也没关系。如果删除公式,它就可以正常工作,但如果删除 :Year 列,它就不再起作用了。我不明白背后的 JSL 逻辑,但事实就是这样。