创建脚本以仅选择与特定日期范围相关的某些值我收到了一个类似这样的文件

我被要求创建一个公式,提取在开始日期和结束日期之间发生的所有代码。我不确定如何将其设置为公式。是否可以将其创建为脚本来提取在开始日期和结束日期之间发生的所有代码?我以前从未设置过脚本,希望有人可以指导我如何创建一个。
谢谢!
数据探索与可视化回复:创建脚本以仅选择与特定日期范围相关的某些值欢迎来到社区。
实际的语句将选择给定日期范围内的行并创建仅包含选定行的新数据表。
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
这是一个完整的示例,首先创建一个示例数据表,然后运行上述行来选择并创建数据表。
(注:下面的例子不知何故被遗漏了。感谢@jthi对遗漏的提醒)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
创建新表的另一种有趣且交互的方法是使用数据过滤器。数据过滤器允许用户以交互方式选择数据表中的行,一旦选择了所需的行,就可以从这些行创建新表。
至此:一旦数据表显示

转到“行”下拉菜单并选择“数据过滤器”

在数据过滤器窗口中,选择开始日期和结束日期,然后单击 + 号

然后将显示过滤器。
单击“显示”和“包含”复选框。指示当过滤器的设置选择行时对数据表中的行采取的操作。

现在可以设置过滤器来进行选择。可以将蓝线拖到所需的开始日期和结束日期,也可以直接在每个过滤器显示的日期区域中输入值。
请注意,随着过滤器的改变,数据表中的行是如何被选中的

选择所需的行后,可以通过从数据过滤器红色三角形的操作列表中选择显示子集选项来创建新的数据表。只需单击数据过滤器标题旁边的红色三角形,然后选择选项


回复:创建脚本以仅选择与特定日期范围相关的某些值您能否提供示例表以便于更轻松地创建示例?
我不太可能为此创建公式,而是创建脚本。我假设您希望提取每行中 date_x 介于开始日期和结束日期之间的所有 code_x 值?它们应该记录在哪里?应该如何处理重复项?数据格式可以更改吗(可以堆叠数据吗)?
@txnelson JMP 社区是否放弃了你的完整示例?
回复:创建脚本以仅选择与特定日期范围相关的某些值这是要使用的示例表。您说得对,我需要查看每一行并获取开始日期和结束日期之间的每个日期的代码。是否有重复并不重要。最终,我需要知道所有代码是否相同,或者每个时间范围内是否有不同的代码。我需要知道每一行在开始日期和结束日期之间的代码是否全部为“2”或全部为“3”或代码的组合。
我认为这肯定需要某种脚本,因为我想不出一个可行的公式。我没有编写脚本的经验,所以任何帮助我都会很感激!!
回复:创建脚本以仅选择与特定日期范围相关的某些值考虑到您的最终需求,这很可能可以变得更简单,但由于没有确切的规范/结果列,我只是创建了一些我认为应该可以帮助您的东西
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

回复:创建脚本以仅选择与特定日期范围相关的某些值Jarmo 的代码非常精彩。我喜欢看他如何处理和解决问题。但是,在我的一生中,我的同事、朋友、配偶和孩子大部分时间都认为我的想法很奇怪。在好日子里,我被称为“书呆子”。
因此,考虑到我的生活状况,我发现大多数人的思维方式与我不同。
@PruningTheSpark状态
“我认为这肯定需要某种脚本,因为我想不出一个可行的公式。我没有创建脚本的经验,所以任何帮助都会很感激!! ”。
我相信大多数 JMP 用户都与 PruningTheSpark 持类似观点。PruningTheSpark 可能认为这个问题没有非脚本解决方案,但 JMP 操纵数据的交互式功能确实非常强大。因此,下面我整理了解决 PruningTheSparks 问题所需的交互式步骤。
从提供的示例数据表开始,我确实对其进行了轻微修改。根据 Jamo 脚本的结果,它显示没有一行具有多个有效代码。考虑到可能存在多个代码,我在第 2 行添加了代码,该代码将显示第 2 行具有多个代码。

第一个任务是找到所有在开始日期和结束日期范围内的代码。由于有 6 个不同的代码列,因此一次性完成此操作的最简单方法是堆叠数据。
表格=>堆栈

这是一个多系列堆栈,标示日期和代码列
现在我可以删除所有有缺失值的代码,因为它们不会计入结果中。因此,我在包含所有代码的数据 2 列中选择一个有缺失值的单元格,然后右键单击并选择“选择匹配单元格”

这将选择第 2 列数据中具有缺失值的所有行。
右键单击 RowState 列并选择删除行

剩下的只有带有代码的行

现在我需要确定这些代码中的哪些属于开始日期和停止日期。为此,我将创建一个新列,我将其称为“介于两者之间”,其公式为

对于行,其数据列(包含原始表中的日期)为 1,表示在范围内;对于行,其数据列(包含原始表中的日期)为 0,表示在范围之外

使用与删除缺失值代码相同的技术,可以选择并删除具有零的行

为了清理表格,可以删除一些不再需要的列

现在的任务是将代码重新放到单行中。为此,可以进行简单的拆分
表格=>拆分


现在要将代码列合并为一列,可以使用名为“合并列”的列实用程序。只需选择要合并的列,然后
Cols=>实用工具=>合并列

弹出一个输入框,填写新列的名称,以及项目之间的分隔符,在本例中为“,”

这会导致表格中出现一个新列

通过删除不再需要的列来清理表格

现在要做的就是将结果移回原始数据表。为此,更新平台将发挥作用。单击原始表并
表=>更新

填写要从中获取更新的表,并选择将原始表的 record_id 与拆分表中的 record_id 进行匹配,然后单击确定,原始表将包含解决方案

没有使用任何脚本,只需要 2 个简单的公式列。
现在,在执行这些步骤时,JMP 会将创建所运行的交互式步骤所需的 JSL 放入日志中。因此,只需将这些 JSL 片段复制到脚本中,最后便会得到一个脚本,运行时,该脚本会在眨眼间产生解决方案。
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
您还可以打开一个新的工作流程,打开记录器并逐步完成这些步骤,最终您将得到一个可以在将来用于创建解决方案的工作流程。

回复:创建脚本以仅选择与特定日期范围相关的某些值非常感谢您的帮助!
回复:创建脚本以仅选择与特定日期范围相关的某些值非常感谢你的帮助!截图非常有用!