将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移我有一张数据表,其中包含“时间”列(数值型,连续,格式为 12 小时制,时:分:秒),以及“名称”列(字符型,即每个时间点对应的实验列表)。当我使用此处未提及的其他列作为 Y 轴,以“时间”作为 X 轴绘制图表时,出现了一个问题:由于 X 轴比例在 X 分组变量之间保持不变,因此 X 分组变量之间的每个图都会发生偏移(图 1)。

图 1. 每个 x 分组变量都是一个“名称”列变量,其中“名称”也作为覆盖。
我的想法是编写一个脚本来:
1. 创建新列
2. 使用公式编写新列,将“时间”列转换为以秒为单位的时间,从“0”开始并以指定的间隔(在本例中为 2 秒)向上计数,一旦“名称”列的值发生变化,就重置为 0。
我的主要问题是:
1. 这可能吗?
2. 有没有更简单的方法可以做到这一点而不需要创建新的列?
目前在 Windows 10 上使用 JMP 17.2.0。
谢谢!
数据探索与可视化回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移看看这是否能满足您的需要。
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移谢谢您的回复!
不幸的是,这将返回下图所示的“已用时间”列。

我尝试了以下代码,它也产生了上图中的“时间(s)”列。它似乎执行了将初始值设置为零的功能,但没有转换其他任何值。
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
);
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移您的 :LocalTime 列可能存在一些意外情况。我在一个虚构的表格上尝试了我的公式,它按预期工作。您的 :LocalTime 列的格式是什么?

回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移我创建了一个示例数据表

然后我运行了以下 JSL
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
)
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
得到以下输出

回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移好吧,没关系,我发布的代码确实有效!我的列名拼写错了:confounded_face:
那么剩下的唯一问题是,有没有更简单的方法可以做到这一点而不需要创建新的列?
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移它需要一个新列。它不必是持久列,这意味着它可以是仅在图表存在时存在的列。
Graph Builder(
Transform Column(
"Time (s)",
Formula( :LocalTime - Col Min( :LocalTime, :Name ) )
),
Show Control Panel( 0 ),
Variables( X( :"Time (s)"n ), Y( :Y Column ), Group X( :Name ) ),
Elements( Smoother( X, Y, Legend( 8 ) ) )
);
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移运行图形生成器时,您始终可以使用转换(虚拟)列。这样,数据表中就无需包含实际列。
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移太完美了。感谢你和@txnelson提供的出色解决方案!
回复:将时间转换为时间间隔并根据第二列值重置以防止 x 轴偏移顺便提一下,JMP 的标准做法是将测量单位放入“单位列属性”中。您的情况有所不同,实际列名应该是“时间”,但默认情况下,“单位”值会显示在一对括号中,从而显示的值会更改为“时间(秒)”。